subprocess在父进程之后启动

我有一个简单的代码来testingfork()函数。

  #include<stdio.h> #include<unistd.h> #define MAX_COUNT 10 void main(void) { pid_t pid; int i; fork(); pid = getpid(); for(i = 1; i <= MAX_COUNT; i++) { printf("PID = %d, i = %d\n", pid, i); } } 

它没有按我的预期工作。

我的期望是:父母的结果和孩子的结果交替出现。 有人可以解释这一点,并教我如何解决它? 谢谢!

  PID = 3663, i = 1 PID = 3663, i = 2 PID = 3663, i = 3 PID = 3663, i = 4 PID = 3663, i = 5 PID = 3663, i = 6 PID = 3663, i = 7 PID = 3663, i = 8 PID = 3663, i = 9 PID = 3663, i = 10 PID = 3664, i = 1 PID = 3664, i = 2 PID = 3664, i = 3 PID = 3664, i = 4 PID = 3664, i = 5 PID = 3664, i = 6 PID = 3664, i = 7 PID = 3664, i = 8 PID = 3664, i = 9 PID = 3664, i = 10 

解释很简单。 进程的调度取决于内核。 如果这是一个单核处理器,那么在这个运行中,它决定暂停执行子进程并允许父进程先运行。 父母在为了孩子而暂停前跑了几圈,等等。
在一个多处理器系统中,两个进程可以串联运行,但是控制台设备将根据中断的时间交替输出。

没有保证一个不同的运行将导致相同的输出。 也没有保证不同的内核版本不会做别的。

如果您希望进程在循环之间交替,那么现在是学习进程间通信的时候了 。

主进程没有立即放弃控制,for循环执行得非常快,以至于在第二个进程被调度之前完成。 当我执行你的代码时,我得到了非顺序的打印,但行为依赖于系统。

当你用fork()来玩的时候,有时候可以使用sleep()命令。 试试这个代码…

 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #define MAX_COUNT 10 int main(void) { pid_t pid; int i; fork(); pid = getpid(); srand(pid); // Make sure each process has a different seed for(i = 1; i <= MAX_COUNT; i++) { printf("PID = %d, i = %d\n", pid, i); // Sleep 1-3 seconds. unsigned int sleep_seconds = rand() % 3 + 1; sleep(sleep_seconds); } }