我正在学习考试和做旧任务。我应该告诉这个程序写的是什么:
#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语句吗?如果有人能给出答案的详细解释,我会很高兴。(如果有人需要,我可以获得答案。)提前致谢!
答案 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都在每个进程内单独跟踪,但是它们从父进程的当前状态获取它们的值。
干杯!