問題タブ [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 投票する
4 に答える
4326 参照

perl - Perl の system() で開始したプロセスが子プロセスではないのはなぜですか?

Perl の system() はプロセスを開始しますが、親子関係を壊しますか?

test.pl:

test.sh:

test.pl を実行すると、test.sh の正しい pid が検出され、出力されます。しかし、waitpid() は -1 を返し、test.pl は終了します。test.pl が存在した後、test.sh はまだ実行されています。

test.sh は test.pl の子ではないようで、waitpid() が壊れます。なぜこれが起こるのか、system() を動作させる方法は? これは、Perl が子を自動的にクリアするためですか? はいの場合、子供を明示的に待機する一般的なタスクをどのように解決できますか?

アップデート:

以下の回答では、fork/exec の使用を提案しています。最初の問題はこれです:

  1. Perl スクリプトから、サービスを開始するコマンドライン ユーティリティを実行します。ユーティリティは終了しますが、サービスは残ります。

  2. しばらくしてから、そのサービスの pid を見つけて待機します。

fork/exec はこれを解決しませんが、問題は解決します。

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

c++ - スポーンされた子は state = 127 で終了します

posix_spawnp を使用してさまざまなプロセスを実行し、(waitpid を使用して) ステータスをチェックして、子が適切に作成されたことを確認します。

最初はこれが適切に実行され、次のメッセージが表示されます。

待機: PID 15911 | 状態 0 子は RC=0 で終了しました

同じプロセスを数回実行した後、子プロセスはステータス 127 で終了し始めます。

待機: PID 15947 | 状態 32512 子が RC=127 で終了しました

これが起こった後、私は子供を再び産卵させることができませんでした。上記のコードのセクションを for ループで囲みましたが、適切に生成されません。親プロセスを再起動すると、しばらくは機能しますが、しばらくすると同じ問題が再び発生します。

ここで何が間違っていますか?

0 投票する
4 に答える
16539 参照

c - WIFSIGNALED、WIFSTOPPED、WIFCONTINUED の C でのテスト ケース

私はwaitpid()とsignal()で遊んでいて、WIFSIGNALED(status) = WIFSTOPPED(status) = WIFCONTINUED (status) = trueを返すための信頼できるテストケースを探していますが、何も見つかりません...

コードをデバッグできるように、それらが true を返すようにする方法を教えてください。

また、これらのマクロをテストするために signal() でどのシグナルをキャッチする必要があるかについてのいくつかのヒントが役立ちます...

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

fork - waitpidのWNOHANGオプションをサポートしていないシステムはどれですか?

プロセスで非ブロッキング待機を実行するために、waitpidにPOSIXWNOHANGオプションを渡すことに依存する子プロセスを管理するためのライブラリがあります。すべてのシステムがこのオプションをサポートしているわけではないと言われていますが、私がそれらのシステムのいずれかに取り組んでからしばらく経ちました。このオプションをサポートしていないシステムはどれですか?それらのシステムの回避策を見つけようとするか、それらのシステムをターゲットにしないことを決定できるように、知りたいのですが。

0 投票する
3 に答える
1018 参照

c - derefrences(char *)0が常にセグメンテーション違反になるとは限らないLinuxプログラムはなぜですか?

子プロセスがsegfaultされたことを検出するように設計されたコードをテストしています。このコードが常にセグメンテーション違反ではないことに驚いたと想像してみてください。

私はDebianLinux2.6.26カーネルで実行しています。私のシェルはksh93DebiankshパッケージのAT&T、バージョンM 93s+2008-01-31です。このプログラムはセグメンテーションフォールトを起こすこともありますが、それ以外の場合は、ゼロ以外の終了ステータスでサイレントに終了しますが、メッセージは表示されません。私の信号検出プログラムは次のことを報告します:

純粋な状態で実行するkshと、セグメンテーション違反もまれであることがわかります。

興味深いことに、bash毎回セグメンテーション違反を正しく検出します。

2つの質問があります:

  1. 誰かがこの振る舞いを説明できますか?

  2. 実行のたびに確実にセグメンテーション違反を起こす単純なCプログラムを誰かが提案できますか?私も試しkill(getpid(), SIGSEGV)ましたが、同様の結果が得られました。


編集:jbcreixには答えがあります:私のセグメンテーション違反検出器が壊れていました。ksh同じ問題があるので私はだまされました。私は試してみてbashbash毎回それを正しくしました。

私のエラーは、私がゼロを通過するはずだった場所に通過WNOHANGしていたことでした。waitpid()何を考えていたのかわからない!何が問題なのか疑問に思う人もいますがksh、それは別の質問です。

0 投票する
4 に答える
5446 参照

perl - Perlのwaitpidが間違った終了コードを返すのはなぜですか?

waitpidから間違った終了コードを取得しましたが、その理由がわかりません。誰かが私にいくつかのアイデアを教えてもらえますか?

ここで私がすること:

  1. 私は私の子プロセスをopen2
  2. それから私はそれが終わるのを待ちますwaitpid
  3. を使用して終了コードを取得する$?

子プロセスから返すものは、常に-1で返されます。プログラムが終了コード0を返すことをVSデバッガーで確認します。VSは次のように言います。

pidが一致することを確認しました。

何か案は?

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

c - 終了したプロセスのpidを決定します

SIGCHLDシグナルを送信したプロセスのpidが何であるかを理解しようとしています。これは、SIGCHLD用に作成したシグナルハンドラーで実行したいと思います。どうすればいいですか?私はしようとしています:

スポーンされる子プロセスを待ちたいからです。

0 投票する
3 に答える
7340 参照

c - waitpidは、すでに終了している子プロセスの有効なステータス情報を生成しますか?

私が子forkプロセスであり、親が呼び出す前に子プロセスが終了した場合waitpid、によって設定された終了ステータス情報はwaitpidまだ有効ですか?もしそうなら、それはいつ無効になりますか。つまり、waitpid子pidを呼び出して、任意の時間が経過した後も有効な終了ステータス情報を取得し続けることができるようにするにはどうすればよいですか。また、「クリーンアップ」するにはどうすればよいですか(終了に関心がなくなったことをOSに通知します)。終了した子プロセスのステータス情報)?

次のコードで遊んでいたところ、終了ステータス情報は子が終了してから少なくとも数秒間は有効であるように見えますが、OSに通知する期間や方法がわかりません。waitpid再度呼び出す:

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

perl - Perlの$はなぜですか?フォークされたプロセスの終了コードに間違った値を返しますか?

fork()を実行し、Perlで子が死ぬのを待つという簡単な例を考えてみましょう。

Solaris 10でスクリプトを実行すると、次の結果が得られます。

exit(2)子で行うと出力が。になるため、の値が上にシフトしているのではないかと思います512

私はこれがperlのwaitpidに文書化されているのを見つけることができないようです。これは私のシステムのバグですか、それとも何か間違ったことをしていますか?

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

c - waitpid()を使用した後、WIFSIGNALED()/ WTERMSIG()マクロに問題があります

このコードでは、コマンドラインからプログラムを起動し、SIGTERM(通常の終了のシグナル)とは異なるシグナルからプログラムを閉じると、コマンドラインから渡された最初のプログラムを再起動する必要があります。しかし、そうではありません。実際、私のコードは、プログラムが適切に終了したと言ってプログラムを再起動することはありません。実際には、私の条件「if(WTERMSIG(status)!= SIGTERM)」がうまく機能しないのはなぜですか????? :'(

これは私のコードです: