Child 个进程在 parent 个进程之后开始
Child process starts after parent process
我有一个简单的代码来测试 fork()
函数。
#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);
}
}
它没有像我预期的那样工作。
我的预期是:parent的结果和child的结果交替出现。 有人可以解释一下并教我如何解决吗?谢谢!
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
解释很简单。
进程的调度取决于内核。如果这是一个单核处理器,那么在这个 运行 中它决定暂停 child 执行并允许 parent 进程首先 运行。 parent 运行 循环数次后暂停 child,依此类推。
在多处理器系统中,两个进程可以 运行 串联,但控制台设备将根据中断时间交替输出。
不保证运行不同的运行会产生相同的输出。也不能保证运行不同的内核版本不会做其他事情。
如果您希望进程在循环之间交替,现在是时候学习 interprocess communication。
主进程没有立即放弃控制,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);
}
}