回答:
パイプは、あるプロセスの標準出力を別のプロセスの標準入力に接続するために使用される単純なプロセス間通信(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
パイプが壊れてしまいます。pr
SIGPIPEシグナルを受け取ったことをわざわざ伝えるかどうかは別問題です。シグナルの結果として単純に終了する場合があります(ゼロ以外の終了ステータスを生成します)。
|
文字は、多くの場合、パイプと呼ばれています。さまざまなUNIXシェル(私が知っている)では、1つのコマンドの出力を別のコマンドの入力にパイプするために使用できます。
cat myfile.txt | head
このhead
コマンドは、入力の最初の数行のみを表示します。その時点で、入力を閉じます。これは、入力を生成していたコマンドに問題を引き起こします。どこに書き込みますか?このような状況がある場合、または読者が通る前に書き込みプロセスが終了する場合は、常に「壊れたパイプ」と呼ばれます。
cat
コマンドが永遠に残るのを防ぐために、UNIX標準では、コマンドの送信先となる特別なシグナル(SIGPIPE、シグナル13)を定義していますcat
。このシグナルのデフォルトのアクションは、プロセスをcat
強制終了することです。これにより、うまく終了します。
使用しているアプリケーションに、表示される小さなポップアップメッセージを作成するSIGPIPEを含むすべてのシグナルのシグナルハンドラーがインストールされているようです。
このエラーはかなり頻繁に発生するようです。 /programming/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe それは、「... Xcodeが携帯電話と通信するための内部エラーです。あなたが何か間違ったことをしたということです、それは開発システムのバグです」
パイプは、UnixシステムのIPCメカニズムです。パイプには、読み取り端と書き込み端の2つの端があります。書き込み側に書き込まれたデータは、読み取り側から読み取ることができ、書き込まれた順序で出力されます。
Unixコマンドラインの世界では、パイプはプログラムをつなぎ合わせて仕事を完了する非常に一般的な方法です。たとえばsed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz'
、ファイルを読み込んで、fred.txt
文字列のすべてのインスタンスを文字列foo
で置き換え、その後にいくつかの文字bar
がbar
続く行を検索し、次にを検索しますbaz
。
もちろん、それはそれほど便利ではないようです。しかし、あなたがそれについて考えれば、特にあなたが好きなプログラムを手に入れawk
たりperl
、自由に使ったりしたら、それをあらゆる種類の興味深い用途にどのように使用できるかを見ることができると確信しています。
パイプシステムは非常に初期からUnixの一部でした。また、パイプラインのプロセスが終了した場合、通常、パイプラインのすべてのプログラムを終了する必要があります。これは、デフォルトで、パイプに書き込むプロセスが読み取り側のプロセスがなくなった場合にSIGPIPE
シグナルを受け取ることを意味します。そして、その信号がブロックされた場合write
、パイプが「壊れた」ことを示す特別な種類のエラーで失敗します。
デフォルトの処理はSIGPIPE
、それを受け取るプロセスを強制終了します。そして、それがパイプラインの「ヘッド」ではない場合、全体SIGPIPE
がチェーンに戻って伝播します。
Xcodeが不平を言っているのは、パイプを使って何かを実行するためにサブプログラムを開始し、パイプが壊れたままサブプログラムが突然停止したことです。
「壊れた」パイプとは、一方の端がclose()
「d」で、もう一方の端が読み書きされているものです。たとえば、次のシェルコマンドでは:
cat foo | less
cat
プロセスがパイプの書き込み終了を保持し、less
プロセスは1を読みました。リーダープロセスがパイプを閉じると、パイプが破損します(したがって、役に立たなくなります)。ライタープロセスは、オペレーティングシステムから「壊れたパイプ」エラーを受け取ります。
cat
明らかに終了するとすぐに明らかになります)、リーダーには通常のファイルの終わりが表示されます。