我有一个难闻的问题:(
我有这个代码:
int main()
{
pid_t child, parent;
int status=0;
int i;
printf("parent = %d\n", getpid());
for(i=1; i<=5; i++){
if( (child = fork()) == 0){
sleep(i);
printf("i=%d, %d\n",i, getpid());
}
}
wait(0);
while( (parent = wait(&status)) > 0){
printf("Exit = %d, child = %d\n", status/256, parent);
}
}
和输出类似于:
1, 21320
2, 21321
Exit = 0, child = 21321
3, 21322
Exit = 0, child = 21322
4, 21323
Exit = 0, child = 21323
5, 21324
Exit = 0, child = 21324
而且我认为 wait(0) 不是等待所有子进程,而是等待第一次退出并写入所有 (Exit = ...)。
有什么办法可以做到这一点:
1, 21320
2, 21321
3, 21322
4, 21323
5, 21324
Exit = 0, child = 21320
Exit = 0, child = 21321
Exit = 0, child = 21322
Exit = 0, child = 21323
Exit = 0, child = 21324
?
最佳答案
这是按您要求的顺序生成输出的最简单方法的演示。它使用 3 个循环:一个创建子进程,一个等待它们并收集它们的退出状态,一个打印退出状态。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#define NUMPROC 5
int main(void)
{
pid_t child[NUMPROC];
int status[NUMPROC];
int i;
printf("parent = %d\n", getpid());
for(i=0;i<NUMPROC;++i) {
if(fork() == 0) {
sleep(i);
printf("i=%d, %d\n",i, getpid());
_exit(0);
}
}
for(i=0;i<NUMPROC;++i)
child[i] = wait(&status[i]);
for(i=0;i<NUMPROC;++i)
printf("Exit = %d, child = %d\n", WEXITSTATUS(status[i]), child[i]);
}
关于c - Linux fork() 和 wait(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22431386/