問題タブ [sigpipe]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - SIGPIPE シグナルを無視しても、IOS 6.0 で SIGPIPE エラーが発生する
サンプル アプリでは、main.m ファイルでそのシグナルを無視したにもかかわらず、SIGPIPE エラーが表示されます。
gdbのバックトレースは
スタンバイ モードに戻ってから戻ると、このエラーが発生します。IOS 6.0 を使用して IPAD でテストしました。Xcode のバージョンは 4.5/5.0 です。
c - EPIPEエラーが出ない?
SIGPIPE について読んだ内容に基づいて、SIGPIPE の問題を生成するためのテストを行いました。サーバーとクライアントのコードは次のとおりです。
サーバーコード:
クライアントコード:
実験の設定方法は次のとおりです。最初にサーバーを起動し、次にクライアントを起動しました。クライアントが「メッセージを入力してください:」というメッセージを出力した後、サーバーを停止しました。次に、送信するテキスト (「test」など) をクライアントに入力しようとしました。を使用したため、クライアントからのエラー コードsignal(SIGPIPE, SIG_IGN)
を期待していましたが、何も得られませんでした。EPIPE
クライアントは次のように出力しました。
何か不足していますか?EPIPE
書き込み操作でエラーを返すようにコードを設定するにはどうすればよいですか?
python - エラーコード141のBashパイプフェイルを無視する
bashpipefail
オプションを ( 経由でset -o pipefail
) 設定すると、パイプの任意のステップでゼロ以外のエラーが発生した場合に、スクリプトが失敗するようになります。
ただし、SIGPIPE
存在しないパイプにデータが書き込まれるというエラー (エラー コード 141) が発生しています。
エラーを無視するように bash を設定する方法はありますSIGPIPE
か、またはすべてのエラーステータスコードを処理するエラーハンドラーを作成する方法がありますが、たとえば 0 と 141 はありますか?
たとえば、Python では、以下を追加できます。
エラーにデフォルトの動作を適用するにはSIGPIPE
: エラーを無視します ( http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-06/3823.htmlを参照)。
bashで利用できる同様のオプションはありますか?
perl - どのパイプが SIGPIPE をスローしたかを検出することは可能ですか?
次のように機能するサーバーを処理しようとしています。
- 親プロセスがある
- いくつかの特別なタスクを処理する「ヘルパー」子プロセスを作成します
- パイプで子プロセスを開きます。パイプを使用して子にコマンドを発行します。
- また、他の多くの子プロセスを生成します (サーバーの主な目的は、さまざまなコマンドを実行することです)。
子プロセスへのパイプへの書き込みがいつ失敗したかを検出できるようにしたいと考えています。と特別通知書を発行します。
通常は$SIG{PIPE}
、親プロセスでカスタム ハンドラーを作成することでこれを実現します。
ただし、私が懸念しているのは、コマンドを実行するために親が起動するプロセスの一部が、独自のパイプを開いている可能性があるという事実です。これらのパイプへの書き込みが失敗した場合は、単に SIGPIPE を無視したいと思います。
Q1. SIGPIPE ハンドラー内から、開いているパイプのどれがシグナルをスローしたかを知る方法はありますか? (私はすべての子の PID を知っているので、PID で問題ありません... または、ファイル記述子 #s を介してそれを行う方法がある場合は?)。
Q2. どういうわけか使用して問題を解決できlocal $SIG{PIPE}
ますか?私の仮定は、私がする必要があるということです:
- そのパイプに書き込む前にヘルパープロセス固有の
local $SIG{PIPE}
権利を設定する - do
print $HELPER_PIPE
(これは 1 つのサブルーチンでのみ発生します) - $SIG{PIPE} を
DEFAULT
またはにリセットしますIGNORE
- これら 3 つのアクションが独自のブロック スコープ内にあることを確認します。
c - SIGPIPE シグナル処理
関連する 2 つのプロセス間のパイプ通信がどのように機能するかを理解しようとしているので、この単純な C プログラムを作成しました。
私がパイプを作成し、子がそれに何かを書き込み、親がメッセージを読み、読み取り側のパイプを閉じます。今までは完全に機能していましたが、パイプが読み取り側で閉じられた状態で 2 番目のメッセージを送信しようとすると、sigpipe_h 関数によって処理される SIGPIPE シグナルが発生するはずですよね? なぜそれが起こらないのですか?どこが間違っていますか?
助けてくれてありがとう。
c - クローズ ソケットへの書き込みで期待どおりに SIGPIPE が発生しませんでした
を防ぐ方法についてはすでに読んだのでSIGPIPE
、それをテストする小さなプログラムを書きます。これがコードです。
server.c
client.c
サーバーとクライアントを同じ Linux マシンで実行すると、サーバー側で、クライアント側でソケットを閉じたためにシグナルwrite()
を期待している間に最初に書き込まれたバイト数が返され、2 番目にシグナルが生成されます。
しかし、別の Linux マシンまたは Windows マシン (Winsock で同じクライアントを実装) でクライアントを実行したとき、シグナルをキャッチせず、2 番目はまだ. 誰かが私に何が起こっているのか教えてもらえますか?SIGPIPE
write()
SIGPIPE
SIGPIPE
write()
buffer
gdb - Eclipse CDT: スレッドがデバッグモードで SIGPIPE を取得しています
ソケットプログラミングとマルチスレッドに基づいて、C言語で書かれたツールがあります。ツールを単純に実行すると、エラーは発生せず、ツールは問題なく機能します。
しかし、ツールをデバッグ モードで実行すると、スレッドを切り替えると SIGPIPE シグナルが発生するため、ツールからサーバーにデータを転送できませんでした。
SIGNAL(SIGPIPE, SIG_IGN) を使用して SIGPIPE を処理すると、スレッドが機能しますか?
私が理解している限り、これはスレッド間のプロセス間通信の失敗が原因で発生しています。もしそうなら、どうすればそのようなマルチスレッドアプリケーションをデバッグできますか?
この問題を処理する方法を教えてください。
linux - Trap SIGPIPE when trying to write without reader
I am trying to implement a named-pipe communication solution between two processes in Bash.
The first process writes something to the named pipe:
And the second script is supposed to read the named pipe like this:
Note that the named pipe has been previously created using the traditional command
My problem is that the reader script is not always running so that if the writer script tries to write to the named-pipe it will stay blocked until a reader connects to the pipe.
I want to avoid this behavior, and a solution would be to trap a SIGPIPE signal. Indeed, according to man 7 signal is supposed to be sent when trying to write in a pipe with no reader. So I changed my red function by:
But when I run the reader script, the script stays blocked, and "SIGPIPE received" does not get printed.
Am I mistaking on the signal mechanism or is there any better solution to my problem?