C `fork()`子系统以相反的顺序执行
我有一个类似的代码:C `fork()`子系统以相反的顺序执行,c,process,fork,C,Process,Fork,我有一个类似的代码: for (i = 0; i < 3; i++) { pid = fork(); if (pid == 0) { son_function(); } if (pid < 0) { exit(1); } } void son_function(void) { printf("my pid=%d\n", getpid()); printf("%d: alpha
for (i = 0; i < 3; i++)
{
pid = fork();
if (pid == 0)
{
son_function();
}
if (pid < 0)
{
exit(1);
}
}
void son_function(void)
{
printf("my pid=%d\n", getpid());
printf("%d: alpha\n", getpid());
printf("%d: beta\n", getpid());
printf("%d: charlie\n", getpid());
exit(0);
}
(i=0;i<3;i++)的
{
pid=fork();
如果(pid==0)
{
son_函数();
}
if(pid<0)
{
出口(1);
}
}
void子函数(void)
{
printf(“我的pid=%d\n”,getpid());
printf(“%d:alpha\n”,getpid());
printf(“%d:beta\n”,getpid());
printf(“%d:charlie\n”,getpid());
出口(0);
}
由于某种原因,我无法理解,son\u function()
的执行顺序是相反的。我的意思是,son\u function()
正在从最大到最小打印PID
数字
另一件让我感到奇怪的事情是,每个儿子的指纹都会一个接一个地出现,不可能两个不同过程中的两个指纹同时打印到屏幕上
这里可以看到示例:至少在Windows和Linux下,多个进程可以同时输出到控制台 您可能会先看到一个进程的所有进程,然后再看到其他进程的原因是特定操作系统调度线程的方式。了解这种行为的更好方法是将son_函数改为下面的代码,每个孩子睡不同的时间。行被交错的原因(如前所述)是因为printf缓冲了输出行
void son_function()
{
srandom(getpid());
int sleepTime = random() % 4; // random sleep between 0 and 3 seconds
printf("pid [%d] sleep time is %d\n", getpid(), sleepTime);
printf("my pid = %d\n", getpid());
sleep(sleepTime);
printf("alpha = %d\n", getpid());
sleep(sleepTime);
printf("beta = %d\n", getpid());
sleep(sleepTime);
printf("charlie = %d\n", getpid());
sleep(sleepTime);
}
要以正确的顺序执行子进程,只需在调用fork函数之前在循环中添加wait函数 因此,它将等待子进程终止,并且子进程将以正确的顺序终止
for (i = 0; i < 3; i++)
wait();
pid = fork();
(i=0;i<3;i++)的
等待();
pid=fork();
添加wait函数后执行代码。
getpid()
返回调用进程的进程ID。您可能不应该期望变量pid
和函数getpid()
之间有任何关联。使用一个pid数组,即pid\u t pid[3]代码>。然后通过查看唯一元素(pid[0],…)来跟踪它们。您必须详细说明最后一段。C中的IO流被缓冲,每个换行符发送隐式刷新。每个进程都有自己的流缓冲区。在修复过多的语法和逻辑错误以使您的文章真正可编译之后,将生成一个示例输出。注意前两个PID。您有一个竞争条件。所有子进程都独立运行,它们到达printf
指令的顺序未指定。如果希望子进程按特定顺序执行printf
,则需要使用同步。您的分叉速度太快,以至于在分叉完成之前,所有子进程都没有机会运行。然后,他们同时开始比赛,没有人比其他人领先。那么为什么在控制台的打印中没有碰撞呢?为什么i.e.child-1在其打印之间没有任何其他孩子(即child-2)以正确的顺序打印?