编辑:我的大脑显然自动将pid[1]更正为pid[0]。第一个问题的答案是因为我瞎了。
我们的大学提供了以下代码示例,我添加了一个打印调用以更好地理解实际发生的情况,并使用所有实际返回值。
我原以为我理解了如何分叉和分配进程ID,但实际上并不是这样。
我不明白其中两件事:
- 为什么主进程的进程ID(getpid())等于主进程内部fork()的返回值?它说fork返回子进程的pid。而getpid()返回调用进程的pid,按照逻辑来说它们不能相等。
- 为什么在最后一个例程中pid0和pid2都是零,或者确切地说,最后一个fork()调用中调用了哪个呢?我假设其中一个被克隆了,而另一个代表最后一个fork()的返回值。
我是Stackoverflow的新手,非常感谢您的帮助!
int v[3] = {0, 0, 0};
void handler(int sig) {
v[0]++;
}
int main() {
int pid[3];
signal(SIGUSR1, handler);
printf("Main Process ID: %d\n", getpid());
pid[0] = fork();
pid[1] = getpid();
pid[2] = fork();
if (pid[0] == pid[2]) {
v[1]++;
sleep(4);
} else if (pid[1] == getppid()) {
sleep(3);
v[2]++;
sleep(2);
} else if (pid[1] == getpid()) {
sleep(1);
v[2]++;
kill(pid[2], SIGUSR1);
wait(NULL);
if (pid[0] > 0) {
v[1]++;
wait(NULL);
}
}
printf("ppid %d, processID %d, pid0 %d, pid1 %d, pid2 %d\n", getppid(), getpid(), pid[0], pid[1], pid[2]);
printf("%d %d %d\n", v[0], v[1], v[2]);
}
Result:
Main Process ID: 286161
// 2. Fork (I assume)
ppid 286162, processID 286164, pid0 0, pid1 286162, pid2 0
1 1 0
// 2. Fork (I assume)
ppid 286161, processID 286162, pid0 0, pid1 286162, pid2 286164
0 0 1
// 1. Fork (I assume)
ppid 286161, processID 286163, pid0 286162, pid1 286161, pid2 0
1 0 1
// Main Process
ppid 154332, processID 286161, pid0 286162, pid1 286161, pid2 286163
0 1 1
fork()
时,您正在处理两个独立的进程。如果不防范父进程和子进程将要执行的代码,则子进程将执行在其之后的所有命令(包括第二次调用fork()
在父进程和第一个子进程中都会被执行)。 - David C. Rankin