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


12

ここに画像の説明を入力してください

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

「パイプ」の概念とは何ですか?


3
パイプは、大量のデータを保持する長いチューブです。パイプの受信側がデータのプルを停止すると、バックアップが開始され、パイプがバーストします。コンピューターは、これが起こったことをパイプにデータを詰め込んでいる終わりを知らせます。
Omnifarious

回答:


7

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

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

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

cat myfile | pager

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


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

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


では、「壊れた」パイプとは何ですか?
モシェ

pr -e4 -n ten-thousand-lines.c | sed 10qパイプが壊れてしまいます。prSIGPIPEシグナルを受け取ったことをわざわざ伝えるかどうかは別問題です。シグナルの結果として単純に終了する場合があります(ゼロ以外の終了ステータスを生成します)。
ジョナサンレフラー

パイプは必ずしも「標準」入力と出力を接続するわけではありませ。コマンドラインからは正しいですが、プログラムを使用してパイプを介してI / Oを渡すことは可能です。
CarlF

2

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

cat myfile.txt | head

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

catコマンドが永遠に残るのを防ぐために、UNIX標準では、コマンドの送信先となる特別なシグナル(SIGPIPEシグナル13)を定義していますcat。このシグナルのデフォルトのアクションは、プロセスをcat強制終了することです。これにより、うまく終了します。

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



1

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

Unixコマンドラインの世界では、パイプはプログラムをつなぎ合わせて仕事を完了する非常に一般的な方法です。たとえばsed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz'、ファイルを読み込んで、fred.txt文字列のすべてのインスタンスを文字列fooで置き換え、その後にいくつかの文字barbar続く行を検索し、次にを検索しますbaz

もちろん、それはそれほど便利ではないようです。しかし、あなたがそれについて考えれば、特にあなたが好きなプログラムを手に入れawkたりperl、自由に使ったりしたら、それをあらゆる種類の興味深い用途にどのように使用できるかを見ることができると確信しています。

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

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

Xcodeが不平を言っているのは、パイプを使って何かを実行するためにサブプログラムを開始し、パイプが壊れたままサブプログラムが突然停止したことです。


0

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

cat foo | less

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


1
実際には、読者が閉じた場合にのみ「破損」します。ライターがそれを閉じると(cat明らかに終了するとすぐに明らかになります)、リーダーには通常のファイルの終わりが表示されます。
Random832

おっと、あなたは絶対に正しい...私は私の答えを更新します。
マイケルトラウシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.