这段代码打印什么?叉在循环中

时间:2014-10-28 21:55:47

标签: c fork

我正在学习考试和做旧任务。我应该告诉这个程序写的是什么:

#include <... .h>
int g = 0;
int main(int argc, char *argv[])
{
    int var = 0;
    pid_t pid;
    while (++var < 7)
        if ((pid = fork()) < 0) {
            perror("fork error");
            exit(1);
        } else if (pid == 0) {
            var+=2;
        } else {
            g++;
            var++;
            if (waitpid(pid, NULL, 0) != pid) {
                perror("waitpid error");
                exit(1);
            }
       }
       printf("mypid = %d parentpid = %d var = %d g = %d\n",
              getpid(), getppid(), var, g);
       exit(0);
}

我要解决的问题是孩子在打电话给叉子时。如果这里有一个子调用,它会进入pid == 0或else语句吗?如果有人能给出答案的详细解释,我会很高兴。(如果有人需要,我可以获得答案。)提前致谢!

2 个答案:

答案 0 :(得分:0)

当您调用fork时,会创建子进程,因此现在您既有父进程又有子进程并行运行。不知道他们执行的顺序。 考虑孩子先执行然后再执行parent.now子进程将得到一个pid == 0;因此,子进程执行其创建的程序部分并执行`var + = 2;`。然后父进程执行程序的一部分,它将等待子进程退出,然后父进程在父进程执行时退出,否则子进程执行并将其状态提供给父进程后父进程退出的父进程。

答案 1 :(得分:0)

所以,这就是将要发生的事情。 Root Parent进程将自行分叉几次,并等到每个孩子运行它之前,然后才打印出来#34; mypid = ... blah blah&#34;声明。孩子们自己会分叉几次。因此,为了使事情易于理解,我将把PID抽象为原始过程的ROOT,C1,C2 ......用于其子过程,以及C1.1,C1.2,C2.1等。孩子的孩子。

进程/语句的运行顺序为:

ROOT (++var=1<7?true) <- FORK()
C1   (var+=2=>3)
C1   printf(mypid=C1, ppid=root, g=0, v=3)
C1   (++var=4<7?true) <- FORK()
C1.1 (var+=2=>6)
C1.1 printf (C1.1, C1, g=0, v=6)
C1.1 (++var=7<7?false)
C1.1 END
C1   (g++=1,v++=5) <- This could happen either before or after c1.1 ends but I'm just treating it as if it happens after the WAIT.
C1   printf (C1, root, g=1, v=5)
C1   (++var=6<7?true) <- FORK()
C1.2 (var+=2=>8)
C1.2 printf(C1.2, C1, g=1, v=8)
C1.2 (++var=9<7?false)
C1.2 END
C1   (g++=2, v++=7)
C1   printf(C1, root, g=2, v=7)
C1   (++var=8<7?false)
C1   END
ROOT (g++=1, v++=2)
ROOT printf(R,0,1,2)
ROOT (++var=3<7?true) <- FORK()
C2   (var+=2=>5)
C2   printf(C2, R, g=1, v=5)
C2   (++var = 6<7?true) <- FORK()
C2.1 (var+=2=>8)
C2.1 printf(C2.1, C2, g=1, v=8)
C2.1 (++var=9<7?false)
C2.1 END
C2   (g++=2, v++=7)
C2   printf(C2, R, 2, 7)
C2   (++var=8<7?false)
C2   END
ROOT (g++=2, v++=4)
ROOT printf(R,0,2,4)
ROOT (++var=5<7?true) <- FORK()
C3   (var+=2=>7)
C3   printf(C3, R, 2, 7)
C3   (++var=8<7?false)
C3   END
ROOT (g++=3, v++=6)
ROOT printf(R,0,3,6)
ROOT (++var=7<7?false)
ROOT END

因此,输出将是:(格式化为MyPid,ParentPid,G,VAR)

C1,   ROOT, 0, 3
C1.1, C1,   0, 6
C1,   ROOT, 1, 5
C1.2, C1,   1, 8
C1,   ROOT, 2, 7
ROOT, 0,    1, 2
C2,   ROOT, 1, 5
C2.1, C2,   1, 8
C2,   ROOT, 2, 7
ROOT, 0,    2, 4
C3,   ROOT, 2, 7
ROOT, 0,    3, 6

希望我能得到正确答案:)希望我的解释方法足够明确。

g和var都在每个进程内单独跟踪,但是它们从父进程的当前状态获取它们的值。

干杯!