問題タブ [waitpid]

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.

0 投票する
0 に答える
134 参照

signals - スリープ中のプロセスへのシグナル

プロセスがスリープ状態でシグナルを受信して​​いるときにプロセスに何が起こるか、シグナルにもかかわらず強制的に初期待機を完了する方法を知りたいです。

プロセスがスリープしている場合(たとえば sleep() を使用)、シグナルを受信すると、自動的にスリープから復帰すると思います。そして、強制的に待機を完了させるために、私にはわかりませんが、次のようなものが機能するかどうかはわかりません:

私が間違っている場合は修正してください。誰かがそれについて教えてくれれば幸いです。多くのコードは必ずしも必要ありません。ほとんど理論的に知りたいです。前もって感謝します。

0 投票する
1 に答える
25431 参照

c - waitpid - 子が正常に終了したにもかかわらず 0 を返す WIFEXITED

waitpid私は、子プロセスを生成し、子プロセスの終了を待つように呼び出すプログラムを書いています。コードは以下のとおりです。

waitpidの状態のマンページWIFEXITED:

これは、成功時に整数 != 0 を返す必要があることを意味すると解釈しますが、これは私のプログラムの実行では発生していません。WIFEXITED(status) == 0

ただし、コマンド ラインから同じプログラムを実行すると$? == 0、gdb から開始すると、次のようになります。

プログラムは正常に動作しますが、トリガーされた警告を除いて、ここで何か他のことが起こっていると思わせます。

編集:
以下のコメントで提案されているように、子が segfault を介して終了したかどうかを確認し、実際にWIFSIGNALED(status)は 1 をWTERMSIG(status)返し、11を返しますSIGSEGV

私が理解していないのは、gdbまたはシェルを介した同じ呼び出しが成功するのに、execvを介した呼び出しがsegfaultで失敗するのはなぜですか?

EDIT2:
私のアプリケーションの動作は、子プロセスの動作、特に宣言された関数で子プロセスが書き込むファイルに大きく依存します__attribute__ ((destructor))waitpid呼び出しが返された後、このファイルは存在し、正しく生成されます。つまり、別のデストラクタのどこか、または私の制御外のどこかでセグメンテーション違反が発生します。

0 投票する
1 に答える
1441 参照

c - Cで子プロセスから終了ステータスを取得する

このコードの何が問題なのかわかりません。これは Linux ボックスの C です。

それがすべきことは、私が作成したすべての子プロセスを強制終了し、すべてが終了するのを待ってから、子ごとに pid、プロセス番号 (私が作成したもの)、およびシグナル番号 (killed の場合は 9 である必要があります) を含む行を出力することです。 )。

それで、私は何を間違っていますか?

0 投票する
0 に答える
72 参照

c++ - 終了する (機能していない) プロセスの Pid をプログラムで取得できますか?

プロセスによっては、そのプロセスのディレクトリwaitpid()から情報を取得したい場合があるため、呼び出す前にどのプロセスが終了しているかを知っておくと便利な問題が発生しています。/proc

C または C++ で、機能していないすべてのプロセスの PID を取得するプログラム的な方法があるかどうかに興味があります。grepからこの情報を取得できることは知っていますがps、プログラムで行うより良い方法があるかどうか疑問に思っています。

0 投票する
1 に答える
889 参照

c - C - どのような状況で、waitpid() の呼び出しが -1 を返し、エラーを通知しますか?

私は SIGCHLD ハンドラーを作成していますが、waitpid() を呼び出すとどのような条件で -1 が返されるのでしょうか?

より具体的には、waitpid(...) を呼び出すループを作成し、終了したすべての子プロセスが取得されるまでループを実行したい場合、waitpid(...) が -1 を返すまで繰り返しますか? そうでなければ、刈り取りが必要な子供が他にいるかどうかをどうやって知ることができますか?

0 投票する
1 に答える
321 参照

linux - 子が最初に実行され、次に親が実行されるようにするにはどうすればよいですか?

以下に、複数のクライアントからリクエストを受け取り、exec を介して数学演算を呼び出し、呼び出されたプロセスからの結果を待って、パイプを介してそれぞれのクライアントに結果を返すアプリケーションの簡単なコード スニペットを示します。

ここで、親が最初にすばやく実行されているという単純な問題に直面しています。これにより、waitpid()失敗し、通常waitpid()は子が終了するのを待ちますが、私の場合、親がwaitpid()失敗しても子は作成されません

私の質問は、sleep()(これで問題は解決しましたが、プログラムの実行が遅くなります!!)またはIPC親よりも先に子供を実行するようにフォークを確認するにはどうすればよいですか

これを考えたとき、シグナルを使用して親やセマフォをブロックして原子性を実現するなど、いくつかのアプローチが頭に浮かびました。子供が最初に実行され、次に親が実行を開始することを確認する簡単なアプローチはありますか

0 投票する
1 に答える
634 参照

perl - Perl の waitpid と open3

open3 によって呼び出されるプログラムの出力が大きすぎる (65536 以上) 場合、waitpid は永久に実行されます。

この問題は WNOHANG によって解決されます。

しかし今、リターンコードは $? -1 です。waitpid のリターンコードです。ダーティハックで解決できます:

そのようなことを行う適切な方法は何ですか?

アップデート。汚いハックが常に機能するとは限らないようです。

0 投票する
2 に答える
66 参照

c - プロセスが戻るのを待っています

検討:

(Computer Systems、Bryant - O'Hallaron から)。

可能なすべての出力シーケンスを求められます。

私は答えました:acbc、abcc、bacc。ただし、ソリューション (bcac) と比較して 1 つの出力がありません。親プロセスは c (waitpid) を出力する前に子プロセスが戻るのを待っているため、この出力は不可能だと思いました。これは真実ではありませんか?なんで?そして、その場合、上記のコードと waitpid 行のない同じコードの違いは何ですか?