从子进程中检索 PID 和退出状态
Posted
技术标签:
【中文标题】从子进程中检索 PID 和退出状态【英文标题】:Retrieving PID and Exit Status from child process 【发布时间】:2015-10-13 02:37:40 【问题描述】:在我的任务中,我要输入“n”个并创建“n”个子进程。从那里,子进程 execl 进入另一个程序,该程序让它们休眠随机数秒(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
【问题讨论】:
status
未初始化。您需要将指向它的指针传递给wait
。
1) 阅读wait
的手册页。 2) 利润。
建议使用 waitpid(),这样您就可以知道哪个孩子退出了。
发布的代码可能应该对变量 'n' 执行一些范围检查,以确保它是一个合理的正值
函数:execl()
失败时代码需要处理错误情况。代码需要处理fork()
失败时的错误情况
【参考方案1】:
建议使用 waitpid() 以便您知道哪个孩子退出了。
fork()
函数将子进程的 pid 返回给父进程(阅读 fork()
的手册页)
要获取/使用子节点的退出状态,wait()
或 waitpid()
有一个参数,它是一个指向 int 变量的指针。
当wait()
或waitpid()
返回其调用者时,int 变量将包含子进程的退出状态。
【讨论】:
以上是关于从子进程中检索 PID 和退出状态的主要内容,如果未能解决你的问题,请参考以下文章