問題タブ [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.
c - waitpid pselect fork sigaction を使用したハンドラーで子プロセスをクリーニングする
メッセージをソケットに受信するサーバーがあり、受信したメッセージごとに fork exec を実行します。この部分は正常に動作しているようです。
しかし、これをノンブロッキング モードで行う必要があるため、waitpid()
(フォーラムの多くのトピックで説明されているように) 終了したすべての子プロセスを適切にクリーンアップするハンドラを作成しました。
問題は、このハンドラーが私のpselect
コマンドに対して中断されたシステム コールを生成し、次のメッセージでプログラムを停止することです。
"select(): Interrupted system call"
sigprocmask()
「競合状態の防止」などのフォーラムでこの問題の説明を見つけたので、いくつかのシグナルをブロックするために使用しようとしましたが、うまくいきませんでした。
これは些細な問題だと思いますが、この種のプログラムを使用するのはこれが初めてです。
助けが必要です。前もって感謝します。
プログラムは次のとおりです。
c - 子プロセスでの変数の変更
私はブライアントとオハラロンに取り組んでいComputer Systems, A Programmer's Perspective
ます。演習 8.16 は、次のようなプログラムの出力を要求します (Web サイトでダウンロードできるヘッダー ファイルを使用しているため、変更しました):
親プロセスは子プロセスが終了するのを待ってからカウンターをインクリメントするため、「カウンター = 1」と答えました。しかし、子供は最初にそれを減らします。しかし、プログラムをテストしたところ、正解は「counter = 2」であることがわかりました。変数「カウンター」は子プロセスと親プロセスで異なりますか? そうでない場合、なぜ答えは 2 なのですか?
c++ - 子プロセスの戻り値
私はfork
とがexec
初めてで、次のプログラムを試しました。
プログラム 1:
プログラム 2:
最初のプログラムを実行すると、「子プロセスは 256 で終了します」という出力が表示されます。256
の代わりに結果が表示されるのはなぜ1
ですか? に変更exit(1)
するexit(2)
と、結果が になる512
のはなぜですか? 0を返す場合にのみ機能しました。
c - C - 1 つの子が終了するのを待っています
ループ内に複数の子プロセスを作成しています。各子供はそれを行い、誰が最初に終了してもかまいません。(関連性があるかどうかはわかりませんが、各子には孫もいます)
子プロセスが終了し、終了したときに他のプロセスを停止するのを待つにはどうすればよいですか?
c - 子が execvp を実行するときに、waitpid が終了ステータスを受信しない
プログラムのようなシェルを作成しようとしています。ls | の実行を確認するためのサンプル スニペット プログラムを作成しました。トイレ。
サンプル プログラムでは、メイン プロセスは、(execvp を使用して) 各コマンドを実行するための子プロセスを作成し、パイプを使用して出力を渡します。
しかし、プログラムを実行すると、2 番目の fork() (pid2) の waitpid がブロックされます。waitpid が存在する場合、プログラムは続行されません。
2 番目の waitpid にコメントを付けると、出力が得られます (子プロセスはバックグラウンドで実行されており、メイン プログラムの終了後に出力を出力しています)。
waitpid の使用における問題は何ですか? 最初の waitpid が機能しているのに、2 番目の waitpid が機能していないのはなぜですか?
注:1) parse は、入力された入力を受け取り、各コマンドを引数と必要なデータを含むリンクされたリストとして返すライブラリです。パースは正常に動作しています
c++ - waitpid() を使用してステータス情報のみを取得する
学校の課題で、教授は、プログラムで作成したバックグラウンド プロセスの状態を保存し、各プロセス エントリが「進行中」または「完了」のプロセス テーブルに保存するように求めています。プロセスが完了した (終了した) かどうかを確認するには、私の教授はこれを行うためにwaitpid()を使用する必要があります。
バックグラウンドで作成したすべてのプロセス(sleep()の束)をループし、各プロセスのIDでwaitpid()かどうかを確認して各プロセスを確認するため、これを行う方法がわかりませんwaitpid() の引数として -1 以外 (エラーではない) を返すと、そのプロセスが終了しているかどうかを本当に知りたいときに、各プロセスがフォアグラウンドにジャンプします。
教授の元の質問:
BACKJOBS: バックグラウンド ジョブとその現在のステータスのリストを出力するコマンド。この機能は、tcsh を使用する場合の jobs コマンドに似ています。各ジョブの現在のステータス (進行中または完了) は、waitpid システム コールを使用して判断できます (詳細については、man waitpid を参照してください)。エラーを報告する呼び出しは、既に完了したものになるため、ステータスは「完了」になります。エラーにならない通話のステータスは「進行中」になります。
c - execve() が最初のループでのみエラーを返す
私はこれについてしばらく頭を悩ませていましたが、今は助けが必要です。子プロセスをフォークして、execve() を介して「echo hello」を呼び出すループを作成しようとしています。
最初、コードは最初の実行で失敗しましたが、その後のすべての実行で成功しました。さて、ここで提示するためにクリーンアップした後、まったく成功しません-私が得るのはエラーだけです! x 10. 私はさらに何かを壊したに違いありません。
これはこのサイトでの 2 番目の質問に過ぎないので、私の質問や建設的な批判を改善するための提案があれば、共有してください! ありがとうございました。