【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;}
阅读全文
0 0
- 【Linux】中管道的几种情况
- Linux中的管道pipe----管道的四种情况和特点
- struts中validate的几种情况
- Struts中validate的几种情况
- Linux进程间通信的几种方法-半双工管道,命名管道,消息队列
- Linux进程间通信的几种方法-半双工管道,命名管道,消息队列
- 管道使用的四种特殊情况!
- 匿名管道的四种特殊情况
- 管道的四种读写情况
- 匿名管道的四种情况
- Linux查看内存分配情况的几种方法
- 关于struts中validate的几种情况
- Struts中validate的几种情况(转)
- 关于JSP中格式化的几种情况
- mysql中主键自动增长时的几种情况
- objective-c中对象复制的几种情况
- mysql中主键自动增长时的几种情况
- sql中索引不会被用到的几种情况
- Python——HTMLParser
- 复合事件 2号的没发表出去补上的
- Spark RDD概念学习系列之RDD的转换图解
- [李景山php] linux 的进程组和会话
- Linux和win7双系统时间错误问题
- 【Linux】中管道的几种情况
- SDUT 1006-->Sum Problem
- Leetcode:Insert Delete GetRandom O(1)
- 大数据学习记录(day6)-图说Mapreduce工作机制
- 【模板】树的直径 DP (模板题:XJOI数字转换)
- JVM学习06:运行时数据区域-运行时常量池
- 561. Array Partition I
- ThreadPoolExecutor + Runnable
- 混淆矩阵,机器学习评价准则,ROC曲线-阈值评价标准