为什么我的分叉进程的父 pid 与父进程自己的 pid 不同?
Why does my forked process's parent pid differ from the parent's own pid?
我正在尝试了解某些 unistd.h
函数的工作原理。
这是我写的代码:
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t pid;
pid=fork();
switch(pid) {
case 0: //child
printf("case 0:\nchild %d\nparent %d\n", getpid(), getppid());
break;
default: //parent
printf("default:\npid(child) %d\nparent %d\n", pid, getpid());
break;
}
}
我觉得case 0
中的getppid()
得到的父pid和default
中的getpid()
得到的父pid应该是一样的,但这是我的小程序的输出:
default:
pid(child) 29208
parent 29207
Process returned 0 (0x0) execution time : 0.001s
Press ENTER to continue.
case 0:
child 29208
parent 1017
它们为什么不同? (一箱 29207,另一箱 1017)
你应该放慢执行速度。正如您在终端中看到的那样,child 在 parent 完成后执行。在这种情况下,它变成了一个孤儿,它的 PID 被重新分配给不同的进程。我不知道这在 Linux 上是否同样有效,但在我的 Mac 上它被重新分配给进程 1。因此在 each 之前添加 sleep()
parent的printf()
.
编辑
我已经编译(用 llvm-gcc
编译)和 运行 你的代码,然后再添加睡眠:
$ ./test
default:
pid(child) 2688
parent 2687
case 0:
child 2688
parent 1
之后:
$ ./test
default:
pid(child) 2780
parent 2779
case 0:
child 2780
parent 2779
EDIT2
由于将 sleep()
放入 child 的 PID 中无法解决任何问题,因此我更改了关于它应该放置在何处的建议。
EDIT3
因为接受的是我的答案而不是 Toby 的,哪个更好,值得一提的是适当的同步机制将利用 wait()
函数。
如果 parent 没有为 child wait()
,它可能会在 child 调用 getppid()
之前退出。如果您希望 parent 仍然存在并成为 parent,您可以通过使其等待来确保这一点:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
const pid_t pid = fork();
switch (pid) {
case 0:
printf("in child: me: %d; parent %d\n", getpid(), getppid());
break;
default: //parent
printf("in parent: child: %d; me %d\n", pid, getpid());
wait(NULL);
break;
}
}
(为了您的方便,我还添加了您忘记包含的 headers - 这表明您没有在编译中启用足够的警告)。
我正在尝试了解某些 unistd.h
函数的工作原理。
这是我写的代码:
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t pid;
pid=fork();
switch(pid) {
case 0: //child
printf("case 0:\nchild %d\nparent %d\n", getpid(), getppid());
break;
default: //parent
printf("default:\npid(child) %d\nparent %d\n", pid, getpid());
break;
}
}
我觉得case 0
中的getppid()
得到的父pid和default
中的getpid()
得到的父pid应该是一样的,但这是我的小程序的输出:
default:
pid(child) 29208
parent 29207
Process returned 0 (0x0) execution time : 0.001s
Press ENTER to continue.
case 0:
child 29208
parent 1017
它们为什么不同? (一箱 29207,另一箱 1017)
你应该放慢执行速度。正如您在终端中看到的那样,child 在 parent 完成后执行。在这种情况下,它变成了一个孤儿,它的 PID 被重新分配给不同的进程。我不知道这在 Linux 上是否同样有效,但在我的 Mac 上它被重新分配给进程 1。因此在 each 之前添加 sleep()
parent的printf()
.
编辑
我已经编译(用 llvm-gcc
编译)和 运行 你的代码,然后再添加睡眠:
$ ./test
default:
pid(child) 2688
parent 2687
case 0:
child 2688
parent 1
之后:
$ ./test
default:
pid(child) 2780
parent 2779
case 0:
child 2780
parent 2779
EDIT2
由于将 sleep()
放入 child 的 PID 中无法解决任何问题,因此我更改了关于它应该放置在何处的建议。
EDIT3
因为接受的是我的答案而不是 Toby 的,哪个更好,值得一提的是适当的同步机制将利用 wait()
函数。
如果 parent 没有为 child wait()
,它可能会在 child 调用 getppid()
之前退出。如果您希望 parent 仍然存在并成为 parent,您可以通过使其等待来确保这一点:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
const pid_t pid = fork();
switch (pid) {
case 0:
printf("in child: me: %d; parent %d\n", getpid(), getppid());
break;
default: //parent
printf("in parent: child: %d; me %d\n", pid, getpid());
wait(NULL);
break;
}
}
(为了您的方便,我还添加了您忘记包含的 headers - 这表明您没有在编译中启用足够的警告)。