使用管道需要注意的四种特殊情况

发布时间:2020-08-16 18:43:34 作者:小杨杨雪松
来源:网络 阅读:528

使用管道需要注意的四种特殊情况

第一种情况:

如果所有指向管道写端的文件描述符都关闭后,还有进程在读的话,当管道所有内容读完后,再次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秒之后父进程读取了数据,然后子进程又开始写了。

 


推荐阅读:
  1. 使用dubbo时你需要注意的
  2. Python中使用缩进需要注意什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

使用 管道 需要注意

上一篇:Mysql优化器对in list的处理

下一篇:【Planning】Reference operation set

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》