在我的任务中,我输入'n'并创建'n'个子进程。从那里,子进程执行到另一个程序,让它们以随机秒数(0到9之间)休眠,然后以随机数的退出状态退出。一旦他们退出,在父母,我将打印孩子的PID和孩子的退出状态。我的问题是我不确定如何在不使用IPC的情况下获得PID或退出状态。随着“孩子死了......”同时出来。这就是我现在想出来的。
父:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main()
{
char input[12];
int n, i, ch;
pid_t pid;
int status;
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);
}
while(wait(NULL)>0)
{
if(WIFEXITED(status))
{
int exitstat = WEXITSTATUS(status);
printf("Child %d is dead with exit status %d\n", pid, exitstat);
}
}
}
子:
int main()
{
srand(time(NULL));
int r = rand() % 10;
printf("In child %d\n", getpid());
sleep(r);
exit(r);
}
当前输出: 我注意到的一些事情是“孩子死了......”输出同时回来了。当他们肯定是不同的。
xxxxxx@ubuntu:~/USP_ASG2$ ./q2
Enter an integer: 3
In child 15624
In child 15623
In child 15622
Child 15624 is dead with exit status 0
Child 15624 is dead with exit status 0
Child 15624 is dead with exit status 0
答案 0 :(得分:0)
建议使用waitpid(),这样你就会知道哪个孩子退出了。
fork()
函数将子项的pid返回给父项(阅读fork()
的手册页)
要获取/使用子项的退出状态,wait()
或waitpid()
有一个参数,该参数是指向int变量的指针。
当wait()
或waitpid()
返回其'调用者时,int变量将包含子项的退出状态。