我有一个简单的代码来测试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);
}
}
它没有像我预期的那样奏效。
我的期望是:父母的结果和孩子的结果交替出现。 有人可以解释这个并教我如何解决它吗?谢谢!
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
答案 0 :(得分:11)
解释很简单。 进程的调度取决于内核。如果这是一个单核处理器,那么在此运行中它决定暂停子执行并允许父进程首先运行。父母在被暂停以支持孩子之前跑了几圈,等等 在多处理器系统中,两个进程可以串联运行,但控制台设备将根据中断的时间交替输出。
无法保证不同的运行会产生相同的输出。也无法保证不同的内核版本不会做其他事情。
如果您希望流程在循环之间交替,现在是学习interprocess communication的时间。
答案 1 :(得分:2)
主要过程不立即放弃控制,并且for循环执行得太快以至于在第二个过程被调度之前完成。当我执行你的代码时,我得到非顺序打印,但行为是系统相关的。
当您与sleep()
一起玩时,有时会抛出fork()
个命令。试试这段代码......
#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);
}
}