wait()不等待每个孩子
我有一个循环创建'n'子进程。进程进入一个单独的程序,睡眠'x'秒,然后返回退出状态'x'。问题是当我尝试等待每个单独的进程时。看起来,我的wait()调用等待最后一个进程,然后程序退出。我希望这样,以便哪个孩子退出,我可以打印他们的信息,然后等待下一个孩子退出并打印他们的信息......等等。wait()不等待每个孩子
代码:
int main()
{
char input[12];
int n, i, ch;
pid_t pid;
int status={0};
printf("Enter an integer: ");
fgets(input, 12, stdin);
if (input[10] == '\n' && input[11] == '\0') { while ((ch = fgetc(stdin)) != EOF && ch != '\n'); }
rmnewline(input);
n = atoi(input);
for(i=0; i<=n-1; i++)
{
pid = fork();
if(pid == 0)
execl("/home/andrew/USP_ASG2/sleep", "sleep", NULL);
}
for(i=0; i<=n-1; i++)
{
wait(&status);
if(WIFEXITED(status))
{
int exitstat = WEXITSTATUS(status);
printf("Child %d is dead with exit status %d\n", pid, exitstat);
}
}
}
输出:
In child 15930
In child 15929
In child 15928
Child 15930 is dead with exit status 5
Child 15930 is dead with exit status 5
Child 15930 is dead with exit status 5
你忘了捕捉wait()
的返回值,所以pid
仍然包含您分叉了最后进程的PID。
这样做:
pid = wait(&status);
,你会得到预期的输出。
谢谢你清理那个!尽管所有的孩子仍然在同一时间以同样的“随机”退出状态退出。编辑:我目前正在改变随机数的种子如何生成,因为这可能是问题。 –
@AndrewRicci当你fork()时,子进程独立于父进程和任何其他子进程运行。它们都是由操作系统分开安排的,所以你无法控制每一个结束的时间而不使用管道,信号或共享内存互斥。退出值完全取决于子进程。 – dbush
他们执行的程序用'srand(time(NULL))生成一个随机数;''然后在0到9之间随机选择一个时间。它不能控制它,只是它们都应该在不同的时间退出。 –
除此之外:作为一种风格,'i
@WeatherVane No.对于基于零的数组偏移,'for(i = 0; i
@AndrewHenle你确定你看过我的评论corerctly?如果'n == 0',循环控制'i