2011-09-01 26 views
5

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.

ある

なぜそれが二回文を印刷しているとどのように私はそれが適切に最初の文の子IDが表示されたら、親のIDを表示するように得ることができますか?

EDIT:あなたが一度あなたのプログラムの実行中に、かつてフォークで、二回のprintfを呼び出しているので、

#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; 
} 
+2

プログラムでは、「親プロセス」という言葉はどこにも印刷しません。彼らはプログラムのテキストには存在しません、なぜあなたはそれらが印刷されると思いますか? –

+3

'man fork'。それを読んで。言葉を理解する。あなた自身で答えを見つける手段がないときは、StackOverflowに行きます。あなたはこの経験のためにより良いプログラマーになるでしょう。 – asveikau

+2

また、 'fork'は親プロセスIDを子に返しません。子には0、親には子のIDを返します。それがあなたがどのようなものかを知る方法です。 –

答えて

9

はじめにfork man pagegetppid/getpidのマニュアルページを読んでください。成功した

フォークさんから

、子プロセスの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)を指定します。

+0

これは2回印刷されます。(forkの人から):新しい子プロセスが作成されると、両方のプロセスはfork()システムコールの次の命令を実行します。したがって、私たちは親と子とを区別しなければなりません。これはfork()の返り値をテストすることによって行うことができます – Icarus

+0

ありがとうございました、これは大きな内訳でした。私は上記の私の改訂コードを編集しました。それは適切に動作するようです。私の論理が正しいことを二度確認してもよろしいですか? – raphnguyen

+0

@ graphnguyen誰もが 'getppid()'を呼び出して親のプロセスIDを取得する必要があります。あなたのサンプルでは、​​親プロセスは代わりにその子プロセスIDを表示します。 – Tom

0

それは二度印刷されます。 printf呼び出しからfork()を取り出してみてください。

2

親と子の両方に印刷しているため、文を2回印刷しています。親は0

の親IDは、このような何かしてみています

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()); 
0

これは正しい出力を取得するための正しい方法ですが....しかし、親ので、多分、時には1として印刷親IDをチャイルズプロセスは終了し、pid = 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); 
関連する問題