进程间通信之socketpair
源代码
c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
int main()
{
//父子通讯管道
int m_pipe[2];
//创建管道
if(socketpair(AF_UNIX,SOCK_STREAM,0,m_pipe) < 0)
{
printf("create socketpair pipe failed\n");
return -1;
}
//建立子进程
pid_t pid =fork();
//子进程创建失败
if(pid <0)
{
close(m_pipe[0]);
close(m_pipe[1]);
return -1;
}
else if(pid == 0)
{
//关闭子进程管道读端
close(m_pipe[0]);
//重定向标准输出到子进程管道写端
dup2(m_pipe[1],STDOUT_FILENO);
//重定向标准输入到子进程管道写端
//dup2(m_pipe[1],STDIN_FILENO);
//关闭子进程管道写端
close(m_pipe[1]);
//执行linux命令行
const char* argv[] = {"ls", "-l","-a", "/home/banting/test/test_dir/",NULL};
execvp("/usr/bin/ls",(char* const*)argv);
//子进程结束
return 0;
}
else if(pid > 0)
{
//保存子进程的进程id
int m_pid = pid;
//关闭父进程管道的写端
close(m_pipe[1]);
//非阻塞等待子进程退出
while(waitpid(m_pid,NULL,WNOHANG) == 0)
{
//睡眠1毫秒
usleep(1000);
//读取子进程的输出信息
char buff[4096] = {0};
int read_len = read(m_pipe[0],buff,sizeof(buff)-4);
if(read_len <= 0)
{
continue;
}
buff[read_len] = '\0';
//打印子进程输出信息
printf("print child process output info begin...\n");
printf("%s\n",buff);
printf("print child process output info end...\n");
return 0;
}
}
return 0;
}
测试
bash
[banting@localhost test]$ vim test.cpp
[banting@localhost test]$ gcc -g test.cpp -o test
[banting@localhost test]$ ./test
print child process output info begin...
total 12
drwxrwxr-x. 2 banting banting 23 Jun 17 09:56 .
drwxrwxr-x. 9 banting banting 8192 Jun 17 10:55 ..
-rw-rw-r--. 1 banting banting 0 Jun 17 09:56 test1.txt
print child process output info end...
[banting@localhost test]$ ls -tlr