校园微网站建设方案,菏泽做网站,佛山网站建设公司哪个性比价好些,国际英文网站因为父子进程是共享文件描述符的环形队列#xff0c;只能读一次 会被后面覆盖
/*#include unistd.hint pipe(int pipefd[2]);功能#xff1a;创建一个匿名管道#xff0c;用于进程间通信参数#xff1a;int 类型数组 #xff0c;是传出参数pipefd[0]是管道读端 p…因为父子进程是共享文件描述符的环形队列只能读一次 会被后面覆盖
/*#include unistd.hint pipe(int pipefd[2]);功能创建一个匿名管道用于进程间通信参数int 类型数组 是传出参数pipefd[0]是管道读端 pipefd[2]是管道写端返回值成功 0失败 -1管道默认是阻塞的如果管道中没有数据read阻塞如果通道满了write阻塞匿名管道只能用于有关系的进程之间的通信父子进程 兄弟进程
*/
//子进程发数据给父进程
#includestdio.h
#includeunistd.h
#includesys/types.h
#includestdlib.h
#includestring.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会堵塞直到管道中有空位置。