私は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;
}
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)を指定しています。
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() );
これは正しい出力を取得するための正しい方法です。ただし、親プロセスが終了し、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);
プログラムの実行時とフォークで1回、printfを2回呼び出しているため、2回印刷されます。 printf呼び出しからfork()を削除してみてください。