gpt4 book ai didi

c - fork() 和父/子进程 ID

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:01 24 4
gpt4 key购买 nike

我有点困惑为什么下面两个程序中的子进程显示不同的父进程 ID。

第一个程序:

 int main ( void ) {
int pid, fpid, ppid;
fpid = fork ();
pid = getpid();
ppid = getppid();
printf ("fpid is %d\n", fpid);
sleep(5);
if (fpid > 0){
printf ("\nThis is Parent. My pid %d. My parent's pid %d\n",pid,ppid);
}
else if (fpid ==0){
sleep(1);
printf ("\nThis is Child. My pid %d. My parent's pid %d\n",pid,ppid);
}
else
printf ("fork failed\n");
return (0);
}

输出:

fpid is 53560
fpid is 0

This is Parent. My pid 53559. My parent's pid 44632

MacBook-Pro:~/Desktop/$

This is Child. My pid 53560. My parent's pid 53559

第二个程序:

int main ( void ) {
int pid, fpid, ppid;
fpid = fork ();
printf ("fpid is is %d\n", fpid);
sleep(5);
if (fpid > 0){
pid = getpid();
ppid = getppid();
printf ("\nThis is Parent. My pid %d. My parent's pid %d\n",pid,ppid);
}
else if (fpid ==0){
sleep(1);
pid = getpid();
ppid = getppid();
printf ("\nThis is Child. My pid %d. My parent's pid %d\n",pid,ppid);
}
else
printf ("fork failed\n");
return (0);
}

输出:

fpid is is 53635
fpid is is 0

This is Parent. My pid 53634. My parent's pid 44632

MacBook-Pro:~/Desktop$

This is Child. My pid 53635. My parent's pid 1

我知道进程 1 是在原始父进程终止后接管父进程的进程。我想我想知道的是:在这两种情况下,父进程不是在子进程可以处理其 printf 之前完成吗?输出不应该相同吗?

最佳答案

由于父进程和子进程并发运行,因此执行顺序取决于运行时。其中一个可以提前完成。当父进程在子进程到达其 getppid() 之前完成时,子进程将被 init 采用。因此父 ID 为 1。
要查看子进程的实际父进程 ID:

  1. 让父级使用wait()waitpid() 等待其子级终止,或者
  2. 让父级在“这是父级”printf() 之后 sleep 一些可感知的时间,例如 sleep(120)

关于c - fork() 和父/子进程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42151119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com