進程間通信之socketpair
源代碼
#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){ //保存子進程的進程idint 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;
}
測試
[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.txtprint child process output info end...
[banting@localhost test]$ ls -tlr
參考文獻
sockpair創建雙向通信的管道
dup和dup2應用及案例
Linux系統編程之exec函數族