我有一段代码可以打印出一次只有Forked的PID,而且只是一个基本的用户输入内容,但每次运行脚本时,有时它会按预期运行,并且所有内容都在一个命令中打印出来,然后,当孩子下次打印它的PID时,它会在下一行上执行,并使终端处于需要按Enter键以继续它的状态。我已经研究过这个网站关于人们不知所措的事情,我已经在所有地方添加,但我仍然无法让它发挥作用。
我的代码:
#include <unistd.h>
#include <stdio.h>
#include "sys/types.h"
int main(){
int pid;
int userInput;
printf("Please enter a number: ");
userInput = getchar();
printf("\nYou entered: ");
putchar(userInput);
printf ("\n");
fflush(0);
pid = fork();
if (0 == pid)
{
printf ("I am the child process, my PID is %d \n", getpid());
fflush(0);
}
else
{
printf ("I am the parent process, my PID is %d \n", getpid());
fflush(0);
}
return 0;
}
这就是我运行几次时会发生的事情:
有人可以指出我出错的地方以及如何纠正它吗?
谢谢!
答案 0 :(得分:5)
因为无法保证父进程和子进程之间的调度和优先级。
您正在观察的通常情况是以下事件:
但你偶尔观察到的是:
虽然您的示例系列运行中未显示,但以下序列也是有效且可能的。
唯一保证的因果排序是父进程打印并退出后出现的命令提示符。操作系统如何安排分叉子进程相对于父进程运行是不确定的。子进程可以在父进程的事件的前,后或之间打印。
如果要保证在子进程和父进程之间对打印语句进行排序,则需要使用跨进程同步原语来协调子进程和父进程。
答案 1 :(得分:-1)
每次分叉进程的打印方式不同?当您执行fork()
时,parent
将会运行foreground
,然后child
将会运行background
并customer
。现在你得到不同的原因,因为如果前台进程完成了后台进程,那么前景和显示其输出和输出反之亦然。
如果命令提示是免费的,如果父母已完成,那么孩子将来到前台&amp;显示其输出,shell不会停止在前台执行子进程。
请注意 执行child&amp;的序列父进程可以推迟依赖于操作系统 。