c/c++ linux 進程間通信系列3,使用socketpair,pipe
阿新 • • 發佈:2018-10-20
dup nis 讀取數據 out ets har memset https %s
linux 進程間通信系列3,使用socketpair,pipe
1,使用socketpair,實現進程間通信,是雙向的。
2,使用pipe,實現進程間通信
使用pipe關鍵點:fd[0]只能用於接收,fd[1]只能用於發送,是單向的。
3,使用pipe,用標準輸入往裏寫。
疑問:在代碼2裏不寫wait函數的話,父進程不能結束,但是在代碼3裏也沒有寫wait函數,父進程卻可以結束???
1,使用socketpair:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <wait.h> int main(){ int sv[2]; pid_t pid; char buf[128]; memset(buf, 0, sizeof(buf)); if(socketpair(AF_UNIX, SOCK_STREAM, 0, sv) != 0){ perror("socketpair"); return 1; } pid = fork(); if(pid < 0){ perror("fork"); return 1; } if(pid == 0){ close(sv[0]); read(sv[1], buf, sizeof(buf)); printf("child process : data from parant process [%s]\n", buf); exit(0); } else { int status; close(sv[1]); write(sv[0], "HELLO", 5); printf("parent process : child process id %d\n", pid); wait(&status); } return 0; }
github源代碼
2,使用pipe:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <wait.h> int main(){ int p[2]; pid_t pid; char buf[128]; memset(buf, 0, sizeof(buf)); if(pipe(p) != 0){ perror("pipe"); return 1; } pid = fork(); if(pid < 0){ perror("fork"); return 1; } if(pid == 0){ close(p[1]); read(p[0], buf, sizeof(buf)); printf("child process : data form parent process [%s]\n", buf); exit(0); } else{ close(p[0]); write(p[1], "aaaa", 4); printf("parent process : child process is %d\n", pid); int status; wait(&status); } return 0; }
github源代碼
3,使用pipe,用標準輸入往裏寫。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <wait.h> int main(){ int p[2]; pid_t pid; char buf[1024]; memset(buf, 0, sizeof(buf)); if(pipe(p) != 0){ perror("pipe"); return 1; } pid = fork(); if(pid < 0){ perror("fork"); return 1; } if(pid == 0){ printf("child process : my_id=%d\n",getpid()); close(p[0]); //把標準輸出給管道1了 dup2(p[1], fileno(stdout)); char *argv[ ]={"ls", "/home/ys/cpp/network"}; //利用ls命令,往標準輸出裏,輸入文件夾裏文件的的名字,標準輸出又連接到了上面開的管道1裏。 if(execve("/bin/ls", argv, NULL) < 0){ perror("exec"); return 1; } exit(0); }else{ int n; FILE* filep; close(p[1]); printf("parent process : child process id=%d\n", pid); //先打開管道1 filep = fdopen(p[0], "r"); if(filep == NULL){ perror("fdopen"); return 1; } //再從管道1裏讀取數據 while(fgets(buf, sizeof(buf), filep) != NULL){ printf("get:%s\n", buf); } int status; wait(&status); } return 0; }
github源代碼
c/c++ 學習互助QQ群:877684253
本人微信:xiaoshitou5854
c/c++ linux 進程間通信系列3,使用socketpair,pipe