問題タブ [epipe]
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.
linux - LinuxおよびUnixでEPIPEを待つにはどうすればよいですか?
LinuxでCのプログラムを書いていますが、パイプファイル記述子が壊れてしまうのを(selectまたはpollを使用して)待ちたいと思います。たとえば、後続のwrite(2 )はEPIPEを返します(またはSIGPIPEが送信されます)。selectのwritefdsまたはexceptfds引数にファイル記述子を追加しても、問題は解決しません。複数のプロセスまたはスレッドを作成することでこれを解決できることは知っていますが、この質問では、単一プロセス、単一スレッドのソリューションにのみ関心があり、できれば選択とポーリングが含まれます(他のファイル記述子イベントも待機したいため)。パイプの反対側に誰がいるのかを推測することはできません。これらのプロセスがプロセスツリー内で遠く離れている場合、ソリューションは機能する必要があります。
Linuxだけでなく多くのUnixシステム間で移植可能なソリューションが好きです。
node.js - child_process.spawnのnode.jsEPIPE例外
node.js v0.6.10
で同じ問題が発生していますが、使用してい0.6.7
ます。基本的に、spawn
別のnode.jsプロセスを開始し、通信stdout
する子プロセスを実行しますstdin
。2つのスクリプトは次のとおりです。
親(cli.js
):
child.js
そして、私が実行するとnode cli.js
:
io - 壊れたパイプ エラーを除外する
宛先としてソケット ( ) を渡した呼び出しからがerror
返されました。リモート ホストは、接続が十分に確立されると単純に接続を切断することが予想されますが、私はそれらから何も受信していません。io.Copy
TCPConn
ドロップが発生すると、次のエラーが発生します。
しかし、私が持っているのはerror
インターフェースだけです。壊れたパイプ エラーを他の種類のエラーと区別するにはどうすればよいですか?
c - send、recvfrom、threads、「Broken Pipe」および SO_RCVTIMEO バグ
ubuntu 10.04で実行されているC ++でコード化されたサーバーがあり、現在本番環境にあり、奇妙なバグが見られます。
環境 :
サーバーに接続する各クライアントには、1 つのソケットと 2 つのスレッドがあります。
- ソケットへの書き込み用の 1 つのスレッド、
- ソケットから読み取るための 1 つのスレッド。
ソケットは10 秒で構成さ::setsockopt
れます。SO_RCVTIMEO
::send
ソケットのそれぞれにフラグMSG_NOSIGNAL
が設定されています(それぞれ::recvfrom
にもフラグが設定されていますが、影響はないようです)
バグ :
次のシナリオがめったに発生しない可能性があるといういくつかの証拠があります (ただし、100% 確実ではありません)。
::recvfrom
が呼び出され、データが存在するかタイムアウトに達するまでブロックされます::send
が呼び出され、ソケットへの書き込みがエラーをトリガーし、EPIPE
(Broken Pipe) エラーを返します- バグ :まだブロックされており、オプション
::recvfrom
を無視して戻ってこないSO_RCVTIMEO
上記のシナリオはあなたにとって意味がありますか?
指標 :
バグはほぼ毎週発生します。1 週間の間に、およそ :
- 20K ソケット使用
- 30M
::recvfrom
コール - 60M
::send
コール
のタイムアウト機能を使用する必要があり::select
ますか? (タイムアウトの実装がそれとは異なると仮定してSO_RCVTIMEO
)
この件について何か考えてくれてありがとう!
c++ - write()からNFSディスク上のファイル記述子にEPIPEを取得することは可能ですか?
私のC++アプリケーションは、へEPIPE
の呼び出しが失敗した後、errnoの結果を受け取ったようwrite()
です。渡されるファイル記述子はwrite()
、NFSマウントされたディスク上のファイル用です。
のマニュアルページは次のようにwrite()
説明EPIPE
しています。
だから私はどうやって得るかについて混乱していますEPIPE
。これはマルチスレッドの問題であり、errnoが別のスレッドに誤って提供されている可能性がありますか?errnoはスレッドセーフだと思ったので、そうは思われませんが、EPIPEを取得しても意味がないようです。これはCentosv4にあります。
c - ループバック アドレスへの接続でのパイプの破損 (EPIPE)
現在、ネットワーク コードをテストしています。これには、IPv4 ループバック アドレス (127.0.0.1) を介した接続が含まれます。残念ながら、プログラムはデータの送信時に EPIPE エラーを頻繁に (常にではありません) 返します。
私は Berkeley ネットワーク ソケットと libevent を使用しています。次の方法でノンブロッキングソケットを作成します。
次の方法で接続イベントを作成します。
そしてそれを次の方法で追加します:
接続する:
接続すると、canSend イベントが発生します。
しかし、送信すると EPIPE エラーが発生することがよくあります。
着陸しreturn CB_SOCKET_FAILURE;
、errno が EPIPE に設定されます。これはなぜでしょう?SIGPIPE がこのエラーでプログラムを中断し続けたため、送信フラグが設定されている場合、MSG_NOSIGNAL になります。EPIPE で CBSocketSend が CB_SOCKET_FAILURE を返してプログラムを中断しないようにしたいのですが、送信が EPIPE で失敗する理由がないのに、なぜそうしているのでしょうか?
前回エラーが発生したとき、接続するスレッドがまだ connect() 呼び出しにあることに気付きました。接続イベントを、接続するスレッドとは別のスレッドで処理することに危険はありますか?
次の場所にあるネットワーク コードを参照してください。
https://github.com/MatthewLM/cbitcoin/blob/master/test/testCBNetworkCommunicator.c https://github.com/MatthewLM/cbitcoin/tree/master/src/structures/CBObject/CBNetworkCommunicator https://github. com/MatthewLM/cbitcoin/tree/master/dependencies/sockets
ありがとうございました。
編集:もう一度実行したところ、connect() が終了した後にエラーが発生しました。
EDIT 2:接続イベントは、反対側からの受け入れなしで提供されているようです。
ruby - 戻るのを待たずに ruby からサブプロセスを実行する
重複の可能性:
Ruby でバックグラウンド プロセスを生成する
これを突っついて数日過ごしました。最近までOSからruby1.8.7を使っていました。バッククォートでサブシェルを呼び出します。サブシェルは、stdout と stderr の両方を閉じた状態でバックグラウンドで任意のプログラムを実行する bash ラッパーでした。その後、disown を実行して init にプロセスを引き継がせ、すぐに復帰しました。これは何年もうまく機能し、このループプロセスがバックグラウンドでジョブを開始し、すぐに「はい、実行されました。それだけです」と報告しました。
すべてをrvm 1.9.3にアップグレードしましたが、このトリックを除いてすべて問題ありません。認めたくないというよりも、ハッキングではないかと疑い始めています。1.9.3 では、そのサブシェルを生成すると常に EPIPE エラーが発生します。パイプが壊れているとのことです。私が 1.8.7 で行っていたことはちょっとひどいように思えるので、1.9.3 では機能しないことを受け入れることができます。
system コマンドを使用してみましたが、open3:popen2 を試しました。彼らはまた、disown ラッパーを呼び出して私と一緒に EPIPE を投げます。
これは disown ラッパーです。Rubyには次のようなものがあります
そして、これが実行されると、スローされます
(ゼロ) 出力を r 変数に代入しない場合、効果は同じです。システム関数と Open3:popen2 を使用します。
したがって、私の目標は、コマンドが戻ってくるのを待たずに、単純に ruby からコマンドを実行することです。数時間かかりますが、追跡する必要はありません。スポーンするだけです。ruby がもはやこれを行うことができないように聞こえ始めた場合、または私の disown ラッパーがあまりにも凶悪で承認を得ることができない場合は、ワーカー スレッド プールを試すかもしれません。Ok。ありがとう。
*編集: すばらしい回答をありがとうございます。キャスパーは、私がルビー用語をもっとうまく扱えていれば、おそらくこれに焦点を合わせていたであろうことを教えてくれたと思います. これが少し歩行者である場合は申し訳ありません。皆さん、素早い回答に感謝します!
node.js - Node.js - 複数のリクエストを実行すると EPIPE エラーが発生する
Node の 'net' モジュールを使用して静的 Web サーバーを作成していますが、ストレス テストを実行する際に問題が発生しました。
これは、テスト自体のコードです。
Node v. 0.8.15 (現在の最新バージョン) で実行している場合、'numOfRequest' が 20 を超えると、サーバーがほぼ崩壊し、1,000 のリクエストのうち、160 までしか正しく処理されません。テスター側から、
fs.createReadStream().pipe() (適切なパラメーターを使用し、 {end: false} を入力) を使用して、ソケット経由でデータを送信しています。また、タイムアウト (2 秒間の非アクティブ状態) 時に socket.destroy() (socket は net.createServer のコールバック関数で受け取った引数) を呼び出し、"Connection: close" をヘッダーとして受け取った場合は socket.end() を呼び出します。 HTTP リクエスト。
何か助けはありますか?私はすべてを試しました。http.get() に切り替える、サーバーを作成するときに {allowHalfOpen: true} を入れるなど - それでも、「エラー: EPIPE を書きます」(または、しばらくすると「エラー: このソケットは閉じられています。 ") はサーバー側から、"ソケット ハングアップ" はクライアント側からです。
android - Android: 書き込みに失敗しました: 書き込みファイルの EPIPE (壊れたパイプ) エラー
Android画面のスクリーンショットをプログラムで撮ろうとしていました。私は次のコードを実行しました:
java.io.IOException: write failed: EPIPE (Broken pipe)
誰か助けてください。私はすでに他の投稿をチェックしていましたが、私の問題を解決するものは何も見つかりません.
編集:
エラーは行で発生することに注意してくださいos.write()
。
node.js - NodeJS - バッファリングせずにリクエスト本文をストリーミングする方法
以下のコードでは、 req.pipe(res) が機能しない理由がわかりませんが、エラーもスローされません。これは nodejs の非同期動作によるものだと推測されますが、これはコールバックのない非常に単純なケースです。
私は何が欠けていますか?
カールは次のとおりです。
デバッグ出力は次のとおりです (本文がアップロードされたことを確認してください)。
サービスは、リクエスト本文をエコーせずに応答します。
...そして最終的なcurlデバッグは
さらに、大きなリクエスト本文でストレス テストを行うと、EPIPE エラーが発生します。どうすればこれを回避できますか?
-- 編集: 試行錯誤の結果、これが機能するようになりましたが、まだタイミングの問題が指摘されています。タイムアウトによりペイロードが返されるため、これはまだ奇妙ですが、タイムアウト期間は気にしません。つまり、タイムアウトを 5 秒または 500 秒に設定しても、ペイロードはリクエストに適切にパイプされ、接続は終了します。
編集は次のとおりです。
?