0

私はCが初めてで、次のコードを見つけました:

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define DISPLAY \
"mypid[%3.3d] - ppid[%3.3d] - f1[%3.3d] - f2[%3.3d] -  f3[%3.3d]\n"
main(void) {
   int f1, f2, f3, mypid, ppid;
   f1 = (int) fork();
   sleep(1);
   f2 = (int) fork();
   sleep(2);
   f3 = (int) fork();
   sleep(3);
   mypid=(int) getpid();
   ppid=(int) getppid();
   printf(DISPLAY, mypid, ppid, f1, f2, f3);
   waitpid(-1,NULL,0);
   waitpid(-1,NULL,0);
   waitpid(-1,NULL,0);
   exit (0);
}

誰でも私を助けることができます.このコードの背後にあるロジックは実際には何ですか? 何度か実行しようとしましたが、まだわかりません。

このコードの結果:

mypid[9341] - ppid[9339] - f1[000] - f2[9342] - f3[9344]

mypid[9346] - ppid[9342] - f1[000] - f2[000] - f3[000]

mypid[9339] - ppid[9220] - f1[9341] - f2[9343] - f3[9345]

mypid[9342] - ppid[9341] - f1[000] - f2[000] - f3[9346]

mypid[9344] - ppid[9341] - f1[000] - f2[9342] - f3[000]

mypid[9343] - ppid[9339] - f1[9341] - f2[000] - f3[9347]

mypid[9347] - ppid[9343] - f1[9341] - f2[000] - f3[000]

mypid[9345] - ppid[9339] - f1[9341] - f2[9343] - f3[000]

4

2 に答える 2

1

と互換性があるため、(int)キャストは役に立ちません。pidをそのまま保存する主な利点は、キャストせずに印刷できることです。pid_tintint

あなたのコードは、fork();このように決して使用しないという非常に悪い使用法を示しています!

正しい使い方は次のとおりです。

f1 = fork();
if (f1 < 0) { perror ("fork"); exit (1); }

if (f1 == 0) {  
    /* here code of child 1 */
    exit (0);
}

f2 = fork();
if (f2 < 0) { perror ("fork"); exit (1); }

if (f2 == 0) {  
    /* here code of child 2 */
    exit (0);
}

/* same for child 3 */

/* Now wait for each child */
wait (NULL);
wait (NULL);
wait (NULL);

あなたの質問に答えるには: fork1 は 1 つのプロセスをfork作成し、2 は 2 つのプロセス (親と子によって呼び出されます) を作成し、 fork3 は 4 を作成するので、8 つのプロセスがあります。

印刷順序はスケジューラに依存します。それを数回実行すると、順序が変更されます (ただし、s のせいでそれほど多くはありませんsleep。それらを抑制して、さらに変更を確認ppid == 1し、親がいつ終了したかを確認します)。

wait子供たちはそうする必要がないので、間違った場所に配置されています (ここでは失敗します) 。waitpid(-1,NULL,0)と同等wait(NULL)です。

于 2013-03-16T11:24:24.653 に答える
0

ここでプログラム

  • 3回分岐し、それぞれの結果をf1、f2、およびf3に保存しました。
  • 次に、現在の pid と親の pid を取得します。
  • そのすべてを印刷します。

そして、フォークに関して:

  • fork() が負の値を返す場合、子プロセスの作成は失敗しています。
  • fork() が新しく作成された子プロセスにゼロを返す場合。
  • fork() が正の値 (子プロセスのプロセス ID) を親プロセスに返す場合。

編集

フォーマット指定子が

"mypid[%3.3d] - ppid[%3.3d] - f1[%3.3d] - f2[%3.3d] -  f3[%3.3d]\n"

次のように解釈されます。

mypid[<first argument>] - ppid[<second argument>] ...

につながる

mypid[9341] - ppid[9339] ...
于 2013-03-16T09:59:48.740 に答える