![什么是“管道”?它怎样才会“破裂”?](https://linux22.com/image/1280188/%E4%BB%80%E4%B9%88%E6%98%AF%E2%80%9C%E7%AE%A1%E9%81%93%E2%80%9D%EF%BC%9F%E5%AE%83%E6%80%8E%E6%A0%B7%E6%89%8D%E4%BC%9A%E2%80%9C%E7%A0%B4%E8%A3%82%E2%80%9D%EF%BC%9F.png)
我多次收到 Xcode 的“管道损坏”错误。我现在很想知道管道到底是什么。
“管道”是什么概念?如何才能“断”呢?
答案1
管道只是一种进程间通信 (IPC) 机制,用于将一个进程的标准输出连接到另一个进程的标准输入。
例如,当您想在文件中搜索单词“pax”时:
cat filename | grep pax
是的,我知道您可以grep
直接访问该文件,但这并不能解释它是如何工作的,对吗?
这将命令的标准输出连接cat
到命令的标准输入grep
。cat
将文件的内容发送到其标准输出,并grep
从其标准输入读取其文件(在本例中)。通过像这样将进程连接在一起,您可以创建由任意数量的管道段组成的自己的工具。例如:
show_users | grep pax | awk -F: '{print $4}' | tr '[a-z]' '[A-Z]' | cut -c1-20
A破碎的管道是指(通常)数据接收方已关闭连接而发送方仍在尝试发送数据。
例如,如果您通过寻呼机程序发送一个大文件(一次查看一页):
cat myfile | pager
然后执行CTRL-BREAK,这可能会导致进程在完成使用pager
之前关闭其输入管道。这是导致管道损坏的一种可能性。cat
从粗略谷歌搜索,这个特定问题似乎与临时部署有关,给出的解决方案通常包括退出大部分软件并重新启动大部分设备。
这个问题可能已经严重到需要向苹果报告的程度。抱怨的开发者越多,他们就越有可能采取措施来解决这个问题。
答案2
这个|
字符通常被称为管道。在各种 UNIX shell 中(就我所知),它可用于将一个命令的输出通过管道传输到另一个命令的输入。
cat myfile.txt | head
该head
命令仅显示其输入的前几行。此时,它会关闭其输入。这对生成输入的命令来说是一个问题。它会写入哪里?每当我们遇到这种情况,或者写入过程在读取器完成之前结束的情况时,就称为“管道损坏”。
为了防止cat
命令永远持续下去,UNIX 标准定义了一个特殊信号 (信号管道,信号 13) 发送给cat
。此信号的默认操作是终止进程,这样就cat
完美结束了。
看起来您正在使用的应用程序已经为所有信号(包括 SIGPIPE)安装了信号处理程序,它会创建您看到的小弹出消息。
答案3
这个错误似乎经常出现。 https://stackoverflow.com/questions/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe 这是“...Xcode 与手机通信时出现的内部错误。这并不意味着你做错了什么,这只是开发系统的一个错误”
答案4
“损坏的”管道是指管道的一端已被close()
破坏,而另一端正在被读取或写入。例如,在以下 shell 命令中:
cat foo | less
进程cat
持有管道的写入端,进程less
持有读取端。如果读取进程关闭管道,则管道已损坏(因此无用);写入进程将从操作系统收到“管道损坏”错误。