0

この問題を解決するために使用できるシステムコールはわずかしかなく、それらが状況にどのように役立つかがわからないため、解決方法がわかりません。

演習:
サイズ [10][1000000] の行列があり、行ごとに fork() を使用して新しいプロセスを作成します。各プロセスの考え方は、その特定の行のすべての番号を調べて特定の番号を見つけ、それに関するメッセージを出力することです。これが問題の最初のステップであり、これで完了です。2 番目のステップは、各行にその数の出現回数の合計をorderごとに出力することです。そして最後に、その数の発生の総合計です。

呼び出し:
私が使用できるシステム コールは、この演習のドキュメントで次のように説明されています。

  • pid_t fork(void);
  • void exit(int status);
  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

問題:呼び出しで 256 未満の数値しか渡せない
ため、どうすればよいかわかりません。発生回数がこの数値よりも大きい場合はどうなりますか? exit()そのような数値を返すにはどうすればよいですか?

別の問題:
と の違いwait()と、どちらwaitpid()をどのように/どこで使用するかを正確に理解していません。man ページ以外に、コード例などを参照して理解を深めることができるドキュメントはありますか? または、誰かが私に違いを説明し、そのような違いを示す基本的な例を提供できますか?

4

2 に答える 2

4

waitpid()子プロセスの終了ステータスを順番に取得するために使用します。を使用しwait()ても、子の死体が取得される順序については保証されません。

Unix では、終了ステータスは 8 ビットに制限されており、データを取得するプログラムによって符号付きまたは符号なしとして処理できます。また、終了した子のシグナル番号とコア ダンプ ステータスを識別する 8 ビット値も取得します。私の知る限り、ステータスまたはシグナルビットのいずれかは常にゼロです(プロセスが正常に終了した場合は両方とも)。

返される数値が 256 より小さいことがわからない場合、終了ステータスは適切ではありません。他の人が言ったように、その場合は他の IPC を使用する必要があります。許可されているシステム コールがそれらだけである場合は、値が 255 未満になるか、オーバーフローが問題にならないと結論付ける必要があります。宿題の演習以外の結論としてはどちらも満足のいくものではありませんが、「現実の世界」では、システムコールが 4 つだけに制限されているわけではありません。

255 より大きい終了コードも参照してください。. Windows では、終了コードの範囲がはるかに広いことに注意してください。ただし、質問に記載されているシステム コールは使用しません。


観察: 私が行うexit(1)と、ステータスの値wait()は 256 です。その理由はありますか?

答え: はい。ステータス ワードの下位 8 ビットは、シグナル番号などをエンコードします。(16 ビット) ステータス ワードの上位 8 ビットは、終了ステータスをエンコードします。

<sys/wait.h>およびマクロ WIFEXITED()、WEXITSTATUS() などを参照してください。

于 2009-04-21T19:54:02.537 に答える
1

あなたがしていることはうまくいくはずです-プロセスからの終了コードとして発生回数を返すだけです。

exit() は 256 未満の数値のみを許可すると述べています。これが当てはまるかどうかは非常に疑わしいですが、テスト プログラムを作成して確実に確認するのは簡単です。

これは実際にはMap-Reduceの単純化されたバージョンにすぎないように思えます。プログラムをさらに並列化する方法についていくつかのアイデアを得るために、そのアルゴリズムも見てみたいと思うかもしれません - そしておそらくいくらかのクレジットを得るでしょう:)

wait() と waitpid() の違いについては、子プロセスのいずれかが完了するのを待ちたい場合は、wait() を使用します。特定の子プロセスだけを待ちたい場合、または子プロセスがハングせずに終了したかどうかだけを確認したい場合は、waitpid() を使用します。

于 2009-04-21T19:36:15.623 に答える