問題タブ [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.
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 の使用を提案しています。最初の問題はこれです:
Perl スクリプトから、サービスを開始するコマンドライン ユーティリティを実行します。ユーティリティは終了しますが、サービスは残ります。
しばらくしてから、そのサービスの pid を見つけて待機します。
fork/exec はこれを解決しませんが、問題は解決します。
c++ - スポーンされた子は state = 127 で終了します
posix_spawnp を使用してさまざまなプロセスを実行し、(waitpid を使用して) ステータスをチェックして、子が適切に作成されたことを確認します。
最初はこれが適切に実行され、次のメッセージが表示されます。
待機: PID 15911 | 状態 0 子は RC=0 で終了しました
同じプロセスを数回実行した後、子プロセスはステータス 127 で終了し始めます。
待機: PID 15947 | 状態 32512 子が RC=127 で終了しました
これが起こった後、私は子供を再び産卵させることができませんでした。上記のコードのセクションを for ループで囲みましたが、適切に生成されません。親プロセスを再起動すると、しばらくは機能しますが、しばらくすると同じ問題が再び発生します。
ここで何が間違っていますか?
c - WIFSIGNALED、WIFSTOPPED、WIFCONTINUED の C でのテスト ケース
私はwaitpid()とsignal()で遊んでいて、WIFSIGNALED(status) = WIFSTOPPED(status) = WIFCONTINUED (status) = trueを返すための信頼できるテストケースを探していますが、何も見つかりません...
コードをデバッグできるように、それらが true を返すようにする方法を教えてください。
また、これらのマクロをテストするために signal() でどのシグナルをキャッチする必要があるかについてのいくつかのヒントが役立ちます...
fork - waitpidのWNOHANGオプションをサポートしていないシステムはどれですか?
プロセスで非ブロッキング待機を実行するために、waitpidにPOSIXWNOHANGオプションを渡すことに依存する子プロセスを管理するためのライブラリがあります。すべてのシステムがこのオプションをサポートしているわけではないと言われていますが、私がそれらのシステムのいずれかに取り組んでからしばらく経ちました。このオプションをサポートしていないシステムはどれですか?それらのシステムの回避策を見つけようとするか、それらのシステムをターゲットにしないことを決定できるように、知りたいのですが。
c - derefrences(char *)0が常にセグメンテーション違反になるとは限らないLinuxプログラムはなぜですか?
子プロセスがsegfaultされたことを検出するように設計されたコードをテストしています。このコードが常にセグメンテーション違反ではないことに驚いたと想像してみてください。
私はDebianLinux2.6.26カーネルで実行しています。私のシェルはksh93
Debianksh
パッケージのAT&T、バージョンM 93s+2008-01-31です。このプログラムはセグメンテーションフォールトを起こすこともありますが、それ以外の場合は、ゼロ以外の終了ステータスでサイレントに終了しますが、メッセージは表示されません。私の信号検出プログラムは次のことを報告します:
純粋な状態で実行するksh
と、セグメンテーション違反もまれであることがわかります。
興味深いことに、bash
毎回セグメンテーション違反を正しく検出します。
2つの質問があります:
誰かがこの振る舞いを説明できますか?
実行のたびに確実にセグメンテーション違反を起こす単純なCプログラムを誰かが提案できますか?私も試し
kill(getpid(), SIGSEGV)
ましたが、同様の結果が得られました。
編集:jbcreixには答えがあります:私のセグメンテーション違反検出器が壊れていました。ksh
同じ問題があるので私はだまされました。私は試してみてbash
、bash
毎回それを正しくしました。
私のエラーは、私がゼロを通過するはずだった場所に通過WNOHANG
していたことでした。waitpid()
何を考えていたのかわからない!何が問題なのか疑問に思う人もいますがksh
、それは別の質問です。
perl - Perlのwaitpidが間違った終了コードを返すのはなぜですか?
waitpidから間違った終了コードを取得しましたが、その理由がわかりません。誰かが私にいくつかのアイデアを教えてもらえますか?
ここで私がすること:
- 私は私の子プロセスを
open2
- それから私はそれが終わるのを待ちます
waitpid
- を使用して終了コードを取得する
$?
子プロセスから返すものは、常に-1で返されます。プログラムが終了コード0を返すことをVSデバッガーで確認します。VSは次のように言います。
pidが一致することを確認しました。
何か案は?
c - 終了したプロセスのpidを決定します
SIGCHLDシグナルを送信したプロセスのpidが何であるかを理解しようとしています。これは、SIGCHLD用に作成したシグナルハンドラーで実行したいと思います。どうすればいいですか?私はしようとしています:
スポーンされる子プロセスを待ちたいからです。
c - waitpidは、すでに終了している子プロセスの有効なステータス情報を生成しますか?
私が子fork
プロセスであり、親が呼び出す前に子プロセスが終了した場合waitpid
、によって設定された終了ステータス情報はwaitpid
まだ有効ですか?もしそうなら、それはいつ無効になりますか。つまり、waitpid
子pidを呼び出して、任意の時間が経過した後も有効な終了ステータス情報を取得し続けることができるようにするにはどうすればよいですか。また、「クリーンアップ」するにはどうすればよいですか(終了に関心がなくなったことをOSに通知します)。終了した子プロセスのステータス情報)?
次のコードで遊んでいたところ、終了ステータス情報は子が終了してから少なくとも数秒間は有効であるように見えますが、OSに通知する期間や方法がわかりません。waitpid
再度呼び出す:
perl - Perlの$はなぜですか?フォークされたプロセスの終了コードに間違った値を返しますか?
fork()を実行し、Perlで子が死ぬのを待つという簡単な例を考えてみましょう。
Solaris 10でスクリプトを実行すると、次の結果が得られます。
exit(2)
子で行うと出力が。になるため、の値が上にシフトしているのではないかと思います512
。
私はこれがperlのwaitpidに文書化されているのを見つけることができないようです。これは私のシステムのバグですか、それとも何か間違ったことをしていますか?
c - waitpid()を使用した後、WIFSIGNALED()/ WTERMSIG()マクロに問題があります
このコードでは、コマンドラインからプログラムを起動し、SIGTERM(通常の終了のシグナル)とは異なるシグナルからプログラムを閉じると、コマンドラインから渡された最初のプログラムを再起動する必要があります。しかし、そうではありません。実際、私のコードは、プログラムが適切に終了したと言ってプログラムを再起動することはありません。実際には、私の条件「if(WTERMSIG(status)!= SIGTERM)」がうまく機能しないのはなぜですか????? :'(
これは私のコードです: