web-dev-qa-db-ja.com

fork()の子プロセスと親プロセス

私はfork()を使用して新しいプロセスを作成するプログラムを作成しようとしています。サンプル出力は次のようになります。

これは子プロセスです。私のpidは733で、親のidは772です。
これは親プロセスです。私のpidは772で、私の子供のIDは773です。

これは私が私のプログラムをコーディングした方法です:

#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), fork());

    return 0;
}

これにより、次の出力が得られます。

これは子プロセスです。私のpidは22163で、親のIDは0です。
これは子プロセスです。私のpidは22162で、親のIDは22163です。

ステートメントを2回出力するのはなぜですか?また、最初の文に子IDが表示された後で、親のIDを適切に表示するにはどうすればよいですか?

編集:

#include <stdio.h>
#include <stdlib.h>

int main() {
int pid = fork();

if (pid == 0) {
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), getppid());
}
else {
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), pid);
}

return 0;
}
6
raphnguyen

forkのmanページ および getppid / getpid のmanページを読むことから始めます。

フォークから

成功すると、子プロセスのPIDは親の実行スレッドで返され、0は子の実行スレッドで返されます。失敗すると、親のコンテキストで-1が返され、子プロセスは作成されず、errnoが適切に設定されます。

したがって、これは次のようなものになるはずです

_if ((pid=fork())==0){
    printf("yada yada %u and yada yada %u",getpid(),getppid());
}
else{ /* avoids error checking*/
    printf("Dont yada yada me, im your parent with pid %u ", getpid());
}
_

あなたの質問について:

これは子プロセスです。私のpidは22163で、親のIDは0です。

これは子プロセスです。私のpidは22162で、私の親のIDは22163です。

fork()printfの前に実行されます。そのため、処理が完了すると、同じ命令を実行する2つのプロセスが実行されます。したがって、printfは2回実行されます。 fork()を呼び出すと、_0_が子プロセスに返され、子プロセスのpidが親プロセスに返されます。

あなたは2つの実行中のプロセスを取得し、それぞれがこれを実行します 命令 ステートメント:

_printf ("... My pid is %d and my parent's id is %d",getpid(),0); 
_

そして

_printf ("... My pid is %d and my parent's id is %d",getpid(),22163);  
_

まとめると、上の行はそのpidを指定する子です。 2行目は親プロセスで、そのID(22162)とその子(22163)を指定しています。

13
Tom

If、elseステートメントでfork()プロセスの呼び出しを制御します。以下の私のコードを参照してください:

int main()
{
   int forkresult, parent_ID;

   forkresult=fork();
   if(forkresult !=0 )
   {
        printf(" I am the parent my ID is = %d" , getpid());
        printf(" and my child ID is = %d\n" , forkresult);
   }
   parent_ID = getpid();

   if(forkresult ==0)
      printf(" I am the  child ID is = %d",getpid());
   else
      printf(" and my parent ID is = %d", parent_ID);
}

親と子の両方に対して出力するため、ステートメントを2回出力します。親の親IDは0です

このようなものを試してください:

 pid_t  pid;
 pid = fork();
 if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(),getppid());
 else 
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), getppid() );
2
Hogan

これは正しい出力を取得するための正しい方法です。ただし、親プロセスが終了し、pid = 1のルートプロセスがこの孤立プロセスを制御するため、子の親IDが1として出力されることがあります。

 pid_t  pid;
 pid = fork();
 if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id 
      is %d.\n", getpid(), getppid());
 else 
     printf("This is the parent process. My pid is %d and my parent's 
         id is %d.\n", getpid(), pid);
0
Nitish Jain

プログラムの実行時とフォークで1回、printfを2回呼び出しているため、2回印刷されます。 printf呼び出しからfork()を削除してみてください。

0
Daniel Pereira