什么是“管道”?它怎样才会“破裂”?

什么是“管道”?它怎样才会“破裂”?

在此处输入图片描述

我多次收到 Xcode 的“管道损坏”错误。我现在很想知道管道到底是什么。

“管道”是什么概念?如何才能“断”呢?

答案1

管道只是一种进程间通信 (IPC) 机制,用于将一个进程的标准输出连接到另一个进程的标准输入。

例如,当您想在文件中搜索单词“pax”时:

cat filename | grep pax

是的,我知道您可以grep直接访问该文件,但这并不能解释它是如何工作的,对吗?

这将命令的标准输出连接cat到命令的标准输入grepcat将文件的内容发送到其标准输出,并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持有读取端。如果读取进程关闭管道,则管道已损坏(因此无用);写入进程将从操作系统收到“管道损坏”错误。

相关内容