繁体   English   中英

fork()sys_call中出现一些奇怪的结果

[英]Some strange result in fork() sys_call

我有以下代码:

int main(){
  int i = 4, pid;
  while (--i){
    pid = fork();
    if (pid || (i&1))
      printf ("Boo %d\n", i);
  }
  return 0;
}

我理解代码,但是我不明白为什么当我多次运行代码时会得到不同的结果。

有人可以告诉我时间表如何不同吗?

fork() ,接下来运行的进程(子进程或父进程)本质上是随机的。 if对于所有父进程和一半子进程为true。

当每个孩子成为父母时,随机性仍然存在。

Boo 3
Boo 3
Boo 2
Boo 2
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1

这似乎很合逻辑。 但是在另一次运行中,我得到了:

Boo 3
Boo 2
Boo 1
Boo 3
Boo 2
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1
Boo 1

在这种情况下,第一个过程直到另一个的伟大祖先才开始运行。

流程调度没有可预测性。 那仅仅是操作系统的本质。 如果需要某种顺序控制,则必须添加额外的代码。 也许一些计时器,互斥锁或主调度。

您必须了解,与程序的其余部分相比,printf的运行速度极其慢,并且printf内部仅一次执行一个进程-其他进程则等待访问控制台。 这意味着打印命令实际上可以执行任何操作。

之前尝试打印一些东西。 这意味着该过程在确保将其输出显示在屏幕上之前无法分叉。 在您的情况下,整个进程树甚至可以在单个printf完成之前立即运行,所有进程都在等待控制台。 操作系统和printf实现可以在众多因素(通常不是进程ID)上决定哪个优先,因此它们对printf的执行似乎是随机的。

如果要确保执行顺序,则需要使用信号量,方法是在轮到一个线程时将信号量从一个线程传递到另一个线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM