扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
使用管道需要注意的四种特殊情况
在盐都等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、网站制作 网站设计制作定制设计,公司网站建设,企业网站建设,品牌网站设计,成都全网营销推广,成都外贸网站制作,盐都网站建设费用合理。
第一种情况:
如果所有指向管道写端的文件描述符都关闭后,还有进程在读的话,当管道所有内容读完后,再次read会返回0.
运行结果:
结果分析:我们在子进程里面写了10次,写完后关闭写,然后父进程读,读了10次之后当读第11次时候,read返回了0,证明管道空了,所以输出了 “pipe is empty,chile quit”.
第二种情况:
如果有指向管道写端的文件描述符都没关闭,而持有写端的进程也没向管道写数据,当有进程从管道读数据的话,那么当管道中所有数据都被读完后,再次read会阻塞,知道管道中再次有了数据才读取数据并返回。
运行结果:
从结果可以看到,当count值为10,9,8,7,6,5的时候,子进程没有写,所以父进程这几次都在阻塞,知道当count小于5时,父进程才开始读了,只向终端输出了4次(4,3,2,1时),
这里体现了阻塞。
第三种情况:
如果所有指向管道写端的文件描述符都关闭了,当有进程向管道的写端write时,那么该进程会收到SIGPIPE信号,通常会导致进程异常终止。
运行结果:
结果分析:
子进程关闭读端,然后向管道写了10次(count次)后,关闭写端,而父进程则先关闭写端,读了5次之后,关闭了读端,然后收到子进程的退出码,我们在这里会看到退出码是13,可见子进程是异常终止的。
第四种情况:
如果有管道读端的文件描述符没有关闭,而持有管道读端的进程也没有向管道中读数据,这时有进程向管道写端写数据,那么在管道写满时再次write会阻塞,直到管道中有了空位置才写入数据并返回。
结果:
我们先让子进程一直写,(死循还),父进程sleep(5),我们会看到当管道写满时,就会阻塞,5秒之后父进程读取了数据,然后子进程又开始写了。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流