it-swarm-ja.com

「パイプ」とは何ですか?どのように「壊す」ことができますか?

enter image description here

Xcodeから「パイプの破損」エラーが何度も発生しました。私は今、パイプが何であるかを正確に知りたいと思っています。

「パイプ」の概念とは何ですか、そしてそれをどのように「壊す」ことができますか?

12
Moshe

パイプは、あるプロセスの標準出力を別のプロセスの標準入力に接続するために使用されるプロセス間通信(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

brokenパイプは、(通常)送信者がまだデータを送信しようとしているときに、データの受信者が接続を閉じたパイプです。

たとえば、大きなファイルをポケットベルプログラムを介して送信する場合(一度に1ページずつ表示するため):

cat myfile | pager

その後、 CTRL-BREAK、これにより、pagerが使用を終了する前に、catプロセスが入力パイプをシャットダウンする可能性があります。これは、この壊れたパイプを取得するための1つの可能性です。


大まかな Google検索 から、この特定の問題はアドホック展開に関連しているようであり、与えられた解決策には通常、ほとんどのソフトウェアを終了し、ほとんどのデバイスを再起動することが含まれます。

これはおそらく、問題をAppleに報告するのに十分深刻です。それについて不平を言う開発者が多ければ多いほど、それを修正するために何かが行われる可能性が高くなります。

7
user53528

|文字はしばしばパイプと呼ばれます。 (私が知っている)さまざまなUNIXシェルでは、あるコマンドの出力を別のコマンドの入力にパイプするために使用できます。

cat myfile.txt | head

headコマンドは、入力の最初の数行のみを表示します。その時点で、入力を閉じます。これは、入力を生成していたコマンドに問題を引き起こします。どこに書き込みますか?このような状況、またはリーダーが完了する前に書き込みプロセスが終了する状況があるときはいつでも、それは「壊れたパイプ」と呼ばれます。

catコマンドが永遠に残るのを防ぐために、UNIX標準では特別なシグナル( [〜#〜] sigpipe [〜#〜]signal 1catに送信します。このシグナルのデフォルトのアクションは、プロセスを強制終了することです。これにより、catが適切に終了します。

使用しているアプリケーションが、表示される小さなポップアップメッセージを作成するSIGPIPEを含む、すべてのシグナルのシグナルハンドラーをインストールしているようです。

2
bukzor

このエラーはかなり頻繁に発生するようです。 https://stackoverflow.com/questions/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe それは「... Xcodeの通信機能の内部エラーですあなたの電話。それはあなたが何か間違ったことをしたという意味ではありません、それは開発システムのバグです。」

1
devictories

パイプは、UnixシステムのIPCメカニズムです。パイプには、読み取り端と書き込み端の2つの端があります。書き込み端に書き込まれるデータは、読み取り端から読み取ることができます。書かれた順に出てきます。

Unixコマンドラインの世界では、パイプは仕事を成し遂げるためにプログラムをフックする非常に一般的な方法です。例えば ​​sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz'ファイルを読み込みますfred.txt文字列fooのすべてのインスタンスを文字列barに置き換え、結果を検索して、barとそれに続くいくつかの文字を含む行を検索し、次にbaz

もちろん、それはそれほど有用ではないようです。しかし、それについて考えれば、特にawkPerlのようなプログラムがあれば、それをあらゆる種類の興味深い用途にどのように活用できるかがわかると思います。廃棄。

パイプシステムは非常に早い段階からUnixの一部でした。また、パイプライン内のプロセスが終了した場合、通常はパイプライン内のすべてのプログラムを終了する必要があります。これは、デフォルトでは、読み取り側のプロセスがなくなったときにパイプに書き込むプロセスがSIGPIPEシグナルを受け取ることを意味します。そして、そのシグナルをブロックした場合でも、writeは失敗し、パイプが「壊れた」ことを示す特別な種類のエラーが発生します。

SIGPIPEのデフォルトの処理は、それを受け取るプロセスを強制終了します。そして、それがパイプラインの「ヘッド」でない場合は、SIGPIPE全体がチェーンの上流に伝播します。

Xcodeが不満を言っているのは、それにつながるパイプを使って何かをするためにサブプログラムを開始し、そのサブプログラムが予期せずに停止してパイプが壊れたということです。

1
Omnifarious

「壊れた」パイプとは、一方の端がclose()され、もう一方の端が読み取りまたは書き込みされているパイプです。たとえば、次のシェルコマンドでは次のようになります。

cat foo | less

catプロセスはパイプの書き込み側を保持し、lessは読み取り側を処理します。リーダープロセスがパイプを閉じると、パイプが壊れます(したがって役に立たなくなります)。ライタープロセスは、オペレーティングシステムから「壊れたパイプ」エラーを受け取ります。

0
Michael Trausch