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

c - ミニシェルで 2 パイプ関数を一時停止する場合、グローバル変数に情報を保存できません

ミニシェルを作成していて、ジョブ制御で問題が発生しました。
メイン関数でデータを取得できず、run_command の下部でもデータを取得できません。
メインの情報を保存して正常に取得する方法を知りたいです。

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

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 つしかないと言うのは正しいですか?

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

c - waitpid が機能しない - デフォルト エラー

1 つのファイルで exec を実行し、それが完了するまで待機するフォークを作成しようとしています。子プロセスの exec がシグナルによって終了した場合、シグナルを出力したい。プログラムの実行に時間がかかりすぎる場合は、タイムアウトを出力したい。

Testreport は、ファイル名に対して以前に宣言された char * です。ただし、waitpidは機能していません。結果のwaitpidとerrnoの値を出力すると、それぞれ-1と14が得られます。errno 14 を調べたところ、ステータスのアドレスが無効であることを示す EFAULT でした。どうしてそうなるの?

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

c - 非子での非ルート ptrace/waitpid

これは私の qn のフォローアップ/修正です: Ptrace/非子の待機

子プロセスではなく、待機しているプロセスが root ユーザーではないプロセスを ptrace または待機するにはどうすればよいですか。

同じグループに入ろうとしましたが、それでも機能しません [操作は許可されていません - 子以外で ptrace を実行する]

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

c - waitpid でフォークを使用する

3 つの子プロセスと 1 つの親プロセスがありますか? 2 つの異なる waitpid は何をしますか? なぜ 2 つあるのですか?

waitpid の後の 2 番目の printf は、3、5、6、34、52、61 (セミコロンを除く) を出力します。2桁の印刷がどのように行われるのかわかりません。2 桁目は、おそらく while ループの printf から来ていることを知っています。

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

c - フォークされた子プロセスの実際の数を正しくカウントする方法は?

しばらく前に、自動 S/MIME 処理用の単純な SMTP ゲートを書きましたが、今度はテストに取り掛かります。メール サーバーでは一般的であるように、メイン プロセスは着信接続ごとに子プロセスを fork します。作成する子プロセスの数を制限することは良い習慣です。

負荷が高い (多数のクライアントからの多数の接続が同時に発生している) 場合、子プロセスが正しくカウントされていないように見えます。問題は、子プロセスが終了したときにカウンターが減少することです。負荷が高い状態が数分続くと、カウンターが実際の子プロセスの数よりも大きくなります (つまり、5 分後には 14 になりますが、何もありません)。

すでにいくつかの調査を行いましたが、何も機能しませんでした。ゾンビプロセスはすべてリープされているので、SIGCHLDハンドリングは問題ないようです。同期の問題かもしれないと思ったのですが、ミューテックスを追加して変数の型をvolatile sig_atomic_t(今のままで)変えても変化なし。シグナルマスキングでも問題ないので、 を使って全シグナルをマスキングしてみsigfillset(&act.sa_mask)ました。

waitpid()ときどき奇妙な PID 値 (172915914 のように非常に大きい) を返すことに気付きました。

質問といくつかのコード。

  1. 他のプロセス (つまりinit) がそれらの一部を取得している可能性はありますか?
  2. 終了後にプロセスがゾンビにならないことはありますか? 自動的に刈り取ることはできますか?
  3. 修正方法は?多分それらを数えるより良い方法はありますか?

で子をフォークするmain():

信号処理:

: 大文字で始まるすべての関数 ( 、など) は、小文字の友達 ( 、 など) と同じように動作し、同じように動作しFork()ますが、より優れたエラー処理を備えています。ステータス。Close()Signal()fork()close()signal()

注 2 : Debian Testing( kernel v3.10.11) を使用して実行およびコンパイルしgcc 4.8.2ます。