問題タブ [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 - ミニシェルで 2 パイプ関数を一時停止する場合、グローバル変数に情報を保存できません
ミニシェルを作成していて、ジョブ制御で問題が発生しました。
メイン関数でデータを取得できず、run_command の下部でもデータを取得できません。
メインの情報を保存して正常に取得する方法を知りたいです。
c - fork() および waitpid 可能な出力
私の教科書には、次のメインルーチンが記載されています。
可能な出力が何であるかを尋ねると、3つ見つかりました:
abcc: OS は最初に実行する子プロセスを選択し、"a" を出力します。次に、OS は子プロセスを一時停止し、親プロセスを再開して "b" を出力します。次に、親は子が完了するまで待機する必要があり、子は「c」を出力し、最後に親は「c」を出力します。
bacc: OS は最初に実行する親プロセスを選択し、「b」を出力します。次に、親は子が完了するのを待って「ac」を出力する必要があります。次に、親は「c」を出力します。
acbc: OS は、完了まで最初に実行する子を選択し、"ac" を出力します。次に、親が最後まで実行され、"bc" が出力されます。
しかし、もう 1 つの答えが教科書 bcac に記載されています。b が最初に出力された場合、親は子が続行するのを待たなければならず、「ac」を出力すると、親は「c」を出力し、すでにリストした bacc を与えるため、これがどのように可能かわかりません. 私が見逃しているものはありますか、それとも可能な出力は 3 つしかないと言うのは正しいですか?
c - waitpid が機能しない - デフォルト エラー
1 つのファイルで exec を実行し、それが完了するまで待機するフォークを作成しようとしています。子プロセスの exec がシグナルによって終了した場合、シグナルを出力したい。プログラムの実行に時間がかかりすぎる場合は、タイムアウトを出力したい。
Testreport は、ファイル名に対して以前に宣言された char * です。ただし、waitpidは機能していません。結果のwaitpidとerrnoの値を出力すると、それぞれ-1と14が得られます。errno 14 を調べたところ、ステータスのアドレスが無効であることを示す EFAULT でした。どうしてそうなるの?
c - 非子での非ルート ptrace/waitpid
これは私の qn のフォローアップ/修正です: Ptrace/非子の待機
子プロセスではなく、待機しているプロセスが root ユーザーではないプロセスを ptrace または待機するにはどうすればよいですか。
同じグループに入ろうとしましたが、それでも機能しません [操作は許可されていません - 子以外で ptrace を実行する]
c - waitpid でフォークを使用する
3 つの子プロセスと 1 つの親プロセスがありますか? 2 つの異なる waitpid は何をしますか? なぜ 2 つあるのですか?
waitpid の後の 2 番目の printf は、3、5、6、34、52、61 (セミコロンを除く) を出力します。2桁の印刷がどのように行われるのかわかりません。2 桁目は、おそらく while ループの printf から来ていることを知っています。
c - フォークされた子プロセスの実際の数を正しくカウントする方法は?
しばらく前に、自動 S/MIME 処理用の単純な SMTP ゲートを書きましたが、今度はテストに取り掛かります。メール サーバーでは一般的であるように、メイン プロセスは着信接続ごとに子プロセスを fork します。作成する子プロセスの数を制限することは良い習慣です。
負荷が高い (多数のクライアントからの多数の接続が同時に発生している) 場合、子プロセスが正しくカウントされていないように見えます。問題は、子プロセスが終了したときにカウンターが減少することです。負荷が高い状態が数分続くと、カウンターが実際の子プロセスの数よりも大きくなります (つまり、5 分後には 14 になりますが、何もありません)。
すでにいくつかの調査を行いましたが、何も機能しませんでした。ゾンビプロセスはすべてリープされているので、SIGCHLD
ハンドリングは問題ないようです。同期の問題かもしれないと思ったのですが、ミューテックスを追加して変数の型をvolatile sig_atomic_t
(今のままで)変えても変化なし。シグナルマスキングでも問題ないので、 を使って全シグナルをマスキングしてみsigfillset(&act.sa_mask)
ました。
waitpid()
ときどき奇妙な PID 値 (172915914 のように非常に大きい) を返すことに気付きました。
質問といくつかのコード。
- 他のプロセス (つまり
init
) がそれらの一部を取得している可能性はありますか? - 終了後にプロセスがゾンビにならないことはありますか? 自動的に刈り取ることはできますか?
- 修正方法は?多分それらを数えるより良い方法はありますか?
で子をフォークするmain()
:
信号処理:
注: 大文字で始まるすべての関数 ( 、など) は、小文字の友達 ( 、 など) と同じように動作し、同じように動作しFork()
ますが、より優れたエラー処理を備えています。ステータス。Close()
Signal()
fork()
close()
signal()
注 2 : Debian Testing( kernel v3.10.11
) を使用して実行およびコンパイルしgcc 4.8.2
ます。