bugfix> c > 投稿

子プロセスプロセスにfork()を使用しているとき、私は完全にはわかりません 他のプロセスの親である子プロセス(ステータス0)であっても、他の子プロセスを作成する子プロセスがありますか?

#include <stdio.h>
int main()
{
    printf("new proces");
    if (fork() == 0) {
        printf("child parent");
        if (fork() == 0)
            printf("child child");
    }
    printf("\n");
}

子プロセスがfork()を呼び出すときに新しいプロセスを作成するかどうかわからないので、私は混乱していますか? このコードでは

#include<stdio.h>
int main(){
printf(" do ");
if(fork()!=0) printf("ma ");
if(fork()==0) printf("to \n");
else printf("\n");

}

このコードのように、ステータス0を持たない子親プロセスがあり、それが最初の親プロセスの子プロセスであるために理由がわかりません

do ma 
do ma to
do to
do

こうじゃない

do ma
do do to
to

forkを呼び出す子プロセスが0を返さないのは、1つだけでなく2つのmaがあり、その理由がわからない

回答 1 件
  • はい。プロセスは子を作成し、次に子が別の子を作成して親になります。
    分岐リターン番号を使用して、子と親を区別できます。フォークから:

    On success, the PID of the child process is returned in the parent, 
    and 0 is returned in the child. On failure, -1 is returned in the parent, 
    no child process is created, and errno is set appropriately.
    
    

    fork()の戻り値を確認する必要があります。 0を返す場合、このプロセスは子であることを意味します。 0より大きい値を返す場合、このプロセスは親であり、返される値は子プロセスIDです。 このプログラムをご覧ください。 usleep を追加しました  プロセスを次々に印刷させるための呼び出し:

    #define _GNU_SOURCE
    #include <stdio.h>
    #include <unistd.h>
    int main(){
        // lets create a family!
        pid_t grandpa_pid = getpid();
        pid_t child_pid;
        if ((child_pid = fork()) == 0){
            pid_t parent_pid = getpid();
            pid_t child_child_pid;
            if ((child_child_pid = fork()) == 0) {
                usleep(200);
                printf("I am child and I will write third. My pid is %d, %d is my parent and %d is my parents parent, so my grandpa.", getpid(), parent_pid, grandpa_pid);
            } else {
                usleep(100);
                // parent_pid = getpid()
                printf("I am parent and I will write second. My pid is %d, %d is my child and %d is my parent.", getpid(), child_child_pid, grandpa_pid);
            }
        } else {
            // grandpa_pid == getpid()
            printf("I am grandpa and I will write first. My pid is %d and %d is my child.", getpid(), child_pid);
        }
        printf("\n");
    }
    
    

    次の出力が生成されます。

    I am grandpa and I will write first. My pid is 5 and 6 is my child.                                                                                                                
    I am parent and I will write second. My pid is 6, 7 is my child and 5 is my parent.                                                                                                
    I am child and I will write third. My pid is 7, 6 is my parent and 5 is my parents parent, so my grandpa.                                                                         
    
    

あなたの答え