【Linux】中管道的几种情况

来源:互联网 发布:java list 拼接字符串 编辑:程序博客网 时间:2024/05/18 03:30

第一种情况:关闭管道的读端和写端

#include<stdio.h>#include<string.h>#include<unistd.h>#include<errno.h>#include<sys/wait.h>int main(){int fds[2];int ret=pipe(fds);if(ret==-1){printf("Create pipe error!errno is :%d\n",errno);return 1;}pid_t id=fork();if(id<0){printf("fork error!");return 2;}else if(id==0){close(fds[0]);//关闭读端char* msg="I am child!";int i=0;while(i<10){if(i<8){write(fds[1],msg,strlen(msg)+1);sleep(1);}sleep(1);++i;}}else{close(fds[1]);//关闭写端char buf[1024];int j=0;while(j<3){ssize_t ret=read(fds[0],buf,sizeof(buf));++j;}close(fds[0]);sleep(10);if(waitpid(id,NULL,0)<0){return 3;}}return 0;}


第二种情况:管道的写端不关闭,父进程一直等待

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<errno.h>#include<string.h>int main(){int fds[2];int ret=pipe(fds);if(ret==-1){printf("Create ppipe error!errno code is:%d\n",errno);return 1;}pid_t id=fork();if(id<0){printf("fork error!");return 2;}else if(id==0){close(fds[0]);//关闭读端char *msg="I am child!";int i=0;while(i<0){if(i<5){write(fds[1],msg,strlen(msg)+1);sleep(1);}sleep(1);++i;}close(fds[1]);}else{close(fds[1]);//关闭写端char buf[1024];int j=0;while(j<100){ssize_t ret=read(fds[0],buf,sizeof(buf));printf("father read :%s,code is %d\n",buf,ret);++j;}if(waitpid(id,NULL,0)<0){return 3;}}return 0;}
第三种情况:子进程一直写,父进程一直读

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/wait.h>#include<errno.h>int main(){int fds[2];//定义一个数组,存三个变量int ret=pipe(fds);//创建管道if(ret==-1)//如果ret等于-1,说明创建管道失败了,返回错误码{printf("Create pipe error!erron code is:%d\n",errno);return 1;}pid_t id=fork();if(id<0){printf("fork error!");return 2;}else if(id==0){close(fds[0]);//关闭读端char* msg="I am child!";int i=0;while(1){write(fds[1],msg,strlen(msg)+1);printf("%d\n",i);++i;}}else{close(fds[1]);//关闭写端char buf[1024];if(waitpid(id,NULL,0)<0){return 3;}}return 0;}
第四种情况:匿名管道

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<errno.h>#include<string.h>int main(){int fds[2];int ret=pipe(fds);if(ret==-1){printf("Create pipe error! errno code is :%d\n",errno);return 1;}pid_t id=fork();if(id<0){printf("fork error!");return 2;}else if(id==0){close(fds[0]);char* msg="I am child!";while(1){write(fds[1],msg,strlen(msg)+1);sleep(1);}}else{close(fds[1]);char buf[1024];while(1){read(fds[0],buf,sizeof(buf));printf("father read:%s\n",buf);}}return 0;}