【发布时间】:2022-01-16 14:39:11
【问题描述】:
所以我想弄清楚这段代码在做什么:
int k = 5;
if(fork() == fork()) ++k; else --k;
printf("%d\n", k);
困扰我的是我收到不同的输出:
4
4
4
6
4
4
4
4
4
6
4
4
4
6
4
6
4
4
我添加了一个 PID 检测器,所以我可以看到所有进程的 ID:
int main ()
{
int k = 5;
if(fork() == fork()) ++k; else --k;
printf("%d\n", k);
int pid;
pid = fork();
if(pid == 0)
{
printf("\n Process id : %d",getpid());
printf("\n Parrent process id : %d\n" ,getppid());
}
return 0;
}
但有时我会得到输出:
Process id : 9472
Parrent process id : 1413
Process id : 9474
Parrent process id : 1413
Process id : 9471
Parrent process id : 1413
Process id : 9473
Parrent process id : 1413
或:
Process id : 9557
Parrent process id : 1413
Process id : 9556
Parrent process id : 1413
Process id : 9558
Parrent process id : 9554
Process id : 9559
Parrent process id : 9553
请让我明白这里发生了什么。
【问题讨论】:
-
Re “困扰我的是我收到不同的输出:”:操作系统不保证进程执行的顺序。因此,来自各种子进程和父进程的输出以不同的顺序出现。而且,由于您的程序不会等待子进程完成,因此有时父进程会在其子进程打印之前退出,然后子进程会重新连接到替代原始父进程的另一个进程。
-
如果你do like this,也许更容易看到发生了什么
-
那里有些可疑之处,@EricPostpischil。如果进程
A的父进程在A本身终止之前终止,那么A应该由进程1 继承,而不是其他进程。 -
您的“PID 检测器”
fork()s 再次,然后报告(仅)来自这些额外分叉的子进程的 PID。以这种方式报告 PPID 的进程都不是早先打印值k的进程——它们是这些进程的子进程。这似乎是一件奇怪的事情,我不确定你认为它在告诉你什么。 -
@TedLyngmo 非常感谢,我想我现在明白了一点!