Ls:書き込みエラー:壊れたパイプエラーメッセージの生成と解決



Ls Write Error Broken Pipe Error Message Generation



議論:ほとんどの場合、プログラムの結果に影響はありません。
その理由は、Cがシェルステートメントを呼び出すとき、ステートメントにデータを渡すための複数のパイプがあるとき、パイプの後の条件が満たされたときに、パイプの前の条件がまだパイプに送られている場合、パイプは閉じられるためです。データを書き込むとエラーが発生します。ただし、コマンドラインとシェルスクリプトで同じステートメントを実行しても、エラーは発生しません。 cでプロンプトが表示されない場合があります。次の例はエラーを待たず、本当の理由が見つからない可能性があります。

情報を探すと、説明はおそらくパイプラインの前のコマンドがパイプラインに継続的に書き込まれることを意味します。パイプラインの後のコマンドは、パイプラインから同時に連続的に読み取られ、書き込まれ、読み取られます。最初に書き込まれ、パイプラインを介して次のコマンドに渡されるわけではありません。したがって、lsディレクトリに多数のディレクトリファイルがある場合、パイプラインへの書き込みプロセスで、パイプラインがすでにhead -n2に達した後のコマンド条件。満足した後、パイプラインは閉じられますが、lsは引き続きパイプラインに書き込み、パイプラインは閉じられます。 、したがって、ls:writeエラー:パイプの破損エラーが報告されます。エラーは報告されていますが、実際に必要な値は正しく取得されているため、通常はプログラムにあまり影響を与えません。



解決策:エラーはプログラムの実行結果に影響しませんが、エラープロンプトを表示したくない場合は、次のようにします。
1. lsを条件でソートする場合、最後の行を取得するためにテールが使用されます。これは間違いなく最初の読み取りであり、次に読み取られます。ls:書き込みエラー:パイププロンプトの破損はありません。
2.プログラムの実行ログが収集されない場合、プログラムのすべての出力はブラックホール> / dev / null> 2&1にインポートされます。

【解決】



  1. スローされた例外信号の特別な処理
  2. まず、パイプラインがない場合、コンテンツは最初に一時ファイルに書き込まれ、次に処理されます。

デモンストレーションプロセス:centos 6.7-X64環境では、AAAディレクトリから最新バージョンを取得してファイルに書き込みます。
1、コマンドラインの実行は上記のエラーを促しません
画像
2、シェルスクリプトの実行は上記のエラーを促しません
画像
画像
3、c呼び出しプロンプトls:書き込みエラー:壊れたパイプエラー
画像
画像
データを見つける、説明はおそらく次のことを意味します:パイプラインの前のコマンドはパイプラインに継続的に書き込まれ、パイプラインの後のコマンドはパイプラインから同時に読み取られ、書き込まれ、読み取られます。次に、パイプラインを介して次のコマンドを渡します。したがって、lsディレクトリに多数のディレクトリファイルがある場合、パイプラインへの書き込みプロセスでパイプライン後のコマンド条件が満たされます。満足した後、パイプラインは閉じられますが、lsは引き続きパイプラインに書き込みます。このとき、パイプラインは閉じているため、エラーが報告されます。 Ls:書き込みエラー:パイプの破損エラー。エラーは報告されていますが、実際に必要な値は正しく取得されているため、通常はプログラムにあまり影響を与えません。

4.パイプの書き込みと読み取りが同時に実行されます。パイプの前にあるすべてのコマンドが書き込まれた後、すべてのデータはパイプを介して次のコマンドに渡されます。
画像
ヘッドが満たされると、パイプラインが閉じられ、パイプラインが閉じられるとパイプラインの以前の操作が終了しますが、パイプラインエラーは表示されません。
画像
カスタマイズされたcプログラム、読み取り後のパイプラインはパイプラインを閉じるための条件を満たし、パイプラインエラーはありません。
画像
画像
参照リンク: https://runpanda.iteye.com/blog/2173604
参考内容:
【壊れたピップエラー】
例:svn log svn:// xxxx |頭-10
このようにして、bashはsvn log svn:// xxxxの実行時にスレッド1を開始し、head-10の実行時にスレッド2を開始します。両方のスレッドが同時に実行されます。スレッド2は、行10を読み取り、パイプを閉じると終了します。ただし、スレッド1はまだ実行中であり、パイプラインへのデータの書き込みを続行しますが、対応するスレッド2パイプラインが閉じられているため、書き込みエラーをスローします:パイプが壊れています。

Cでシェルコマンドを呼び出すと、「ls:write error:Brokenpipe」を出力していることがわかりました。理由は何ですか。通常の手順には影響しません。