因为父子进程是共享文件描述符的环形队列,只能读一次 会被后面覆盖
/*#include <unistd.h>int pipe(int pipefd[2]);功能:创建一个匿名管道,用于进程间通信参数:int 类型数组 ,是传出参数pipefd[0]是管道读端 pipefd[2]是管道写端返回值:成功 0失败 -1管道默认是阻塞的,如果管道中没有数据,read阻塞,如果通道满了,write阻塞匿名管道只能用于有关系的进程之间的通信(父子进程 兄弟进程)
*/
//子进程发数据给父进程
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
int main() {//在fork之前创造管道int pipefd[2];int ret = pipe(pipefd);if(ret == -1) {perror("pipe");exit(0);}pid_t pid = fork();if(pid > 0) {printf("parent process, pid: %d\n", getpid());char buf[1024] = {0};while(1) {int len = read(pipefd[0], buf, sizeof(buf));printf("parent recv: %s, pid: %d\n", buf, getpid());char* str = "hello, i am parent";write(pipefd[1], str, strlen(str));sleep(1);}}else if(pid == 0) {printf("child process, pid: %d\n", getpid());char buf[1024] = {0};while(1) {char* str = "hello, i am child";write(pipefd[1], str, strlen(str));sleep(1);int len = read(pipefd[0], buf, sizeof(buf));printf("child recv: %s, pid: %d\n", buf, getpid());}}return 0;
}
有可能出现自己写自己读的现象
特点(假设都是阻塞态):
1.所有的指向管道写端的文件描述符都关闭了(管道写端引用计数为0),有进程从管道的读端读数据,那么当管道内部的数据被读取之后,再次read会返回0,就像读到文件末尾一样。
2.如果有指向管道写端的文件描述符没有关闭(管道的写端引用计数大于0)。而持有管道写端的进程也没有往管道中读取数据,这个时候有进程从管道中读取数据,那么管道中剩余的数据被读取后,再次read会堵塞,直到管道中有数据可以读了才读取数据并返回
3. 如果所有的指向管道读端的文件描述符关闭了(管道的读端引用计数0),这个时候向管道中写数据,那么该进程会受到信号SIGPIPE,导致进程异常终止。
4.如果有主席昂管道读端的文件描述符没有关闭(管道的读端引用计数大于0),而持有管道读端进程也没有从管道中读数据,这时候有进程向管道中写数据,那么在管道被写满的时候再次write会堵塞,直到管道中有空位置。