ls: write error: Broken pipe 错误信息的产生和解决

论点:大部分情况对程序的结果不会有影响。
产生原因是当C调用shell语句的时候,语句存在多管道传递数据的时候,当管道后的条件满足后会关闭管道,如果管道前的条件还在往管道里写数据就会提示该error。但是在命令行和shell脚本执行同样的语句,不会看到任何错误。 c中有时也不会提示,下面例子就没有等到该错误,可能真正的原因并没有找到。

查找资料,解释大概意思是:管道前的命令不断的向管道write,管道后的命令不断的从管道read,写和读是同时进行的,并不是先写完再通过管道传向下一个命令。所以当ls 目录下的目录文件很多的时候,向管道写的过程中,管道后的命令条件已满足head -n 2,满足后会关闭管道,但ls还是会向管道写,此时管道已经关闭,所以会报错ls:write error: Broken pipe错误。虽然报错,但实际需要的值已经正确获取,所以一般对程序不会影响太大。

解决方式:报错不会影响程序运行结果,但如果不想看到该错误提示可以:
1、ls的时候按条件排序,通过tail去获取最后的行,这样肯定是先写后读,就不会出现ls: write error: Broken pipe的提示。
2、程序的所有输出导入到黑洞 >/dev/null > 2&1,前提是不收集程序运行日志。

【解决方案】

  1. 对抛出的异常信号进行特殊处理
  2. 先不用管道,把内容先写到临时文件后在处理

论证过程: 在centos 6.7-X64环境 ,获取AAA目录下的最新版本并写入文件。
1、命令行执行不会提示上述错误
在这里插入图片描述
2、shell 脚本中执行不会提示上述错误
在这里插入图片描述
在这里插入图片描述
3、c调用提示ls: write error: Broken pipe错误
在这里插入图片描述
在这里插入图片描述
查找资料,解释大概意思是:管道前的命令不断的向管道write,管道后的命令不断的从管道read,写和读是同时进行的,并不是先写完再通过管道传向下一个命令。所以当ls 目录下的目录文件很多的时候,向管道写的过程中,管道后的命令条件已满足,满足后会关闭管道,但ls还是会向管道写,此时管道已经关闭,所以会报错ls:write error: Broken pipe错误。虽然报错,但实际需要的值已经正确获取,所以一般对程序不会影响太大。

4、管道写和读都是同时进行的,并不是管道前的命令全部写完之后,再将全部数据通过管道传给下个命令。
在这里插入图片描述
head满足之后,关闭管道,并且管道之前的操作也随着管道关闭而终止运行,但并没有提示管道错误。
在这里插入图片描述
自定义的c程序,管道后的读满足条件后关闭管道,也并没有提示管道错误。
在这里插入图片描述
在这里插入图片描述
参考链接:https://runpanda.iteye.com/blog/2173604
参考资料内容:
【broken pip error】
例如:svn log svn://xxxx | head -10
这样bash在执行的svn log svn://xxxx的时候起一个线程1,在执行head -10的时候起一个线程2。两个线程同时运行。线程2读到第10行的时候退出,然后关闭管道。但是线程1还在跑,继续往管道里面写数据,但是相对应的线程2的管道已经关闭,所以抛出write error: broken pipe.

当用C调用shell命令的时候,发现打印” ls:write error: Broken pipe“,到底是什么原因产生的?对正常的程序有没有影响。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值