【发布时间】:2015-09-20 18:43:31
【问题描述】:
我有一个简单的代码来测试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
【问题讨论】:
-
这两个进程独立运行,因此一旦发生分叉,您就不能期望任何特定的顺序(这取决于操作系统调度)。如果你想要一个特定的顺序,你必须自己使用同步机制明确地做到这一点。例如等待、信号量、互斥体、管道等。
-
我的意思当然是在进程之间排序。流程中的排序自然而然地得到了很好的定义。
-
尝试将
sleep(1);添加到您的 for 循环中。 -
@QuestionC 这不是一个好主意。它将进程返回给调度程序,但不能保证调度程序会在进程之间交替。
-
如果您的目标只是测试
fork()并四处逛逛,那么到处乱扔睡眠是很正常的做法。我相信 alternatingly 在这种情况下确实意味着非顺序。