我不明白我应该在哪里使用wait(NULL)或while(pid = wait(& status))> 0)。我很困惑,我得到奇怪的结果,请帮助!。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
pid_t childpid = 0;
int i, n;
if (argc != 2){ /* check for valid number of command-line arguments */
fprintf(stderr, "Usage: %s processes\n", argv[0]);
return 1;
}
n = atoi(argv[1]);
for (i = 1; i < n; i++)
if ((childpid = fork()) <= 0)
break;
fprintf(stderr, "i:%d process ID:%ld parent ID:%ld child ID:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
}
如何修改此代码,以便原始进程在所有子项退出后打印出其信息?
您如何修改此代码,以便进程在其子进程退出后打印其信息?
答案 0 :(得分:4)
同样的修改可以完成这两项工作。
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main (int argc, char *argv[])
{
pid_t childpid = 0;
int i, n;
if (argc != 2)
{ /* check for valid number of command-line arguments */
fprintf(stderr, "Usage: %s processes\n", argv[0]);
return 1;
}
n = atoi(argv[1]);
for (i = 1; i < n; i++)
{
if ((childpid = fork()) <= 0)
break;
}
int corpse;
int status;
while ((corpse = wait(&status)) > 0)
{
fprintf(stderr, "%d: child %d exited with status 0x%.4X\n",
(int)getpid(), corpse, status);
}
fprintf(stderr, "i:%d process ID:%ld parent ID:%ld child ID:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
}
当子进程执行wait()
时,它立即失败,因为没有孙子等待。因此,孩子在“孩子们”(他们全部为零)退出后打印输出。
当父进程执行wait()
循环时,它会在信息可用时报告每个子进程,然后打印自己的信息。
一般来说,你有一个以上的孩子,所以第二个问题有点含糊不清。但是,如果您希望它等待一个孩子(并且您不关心哪个孩子),则从wait()
周围移除循环。如果您关心哪个孩子,请使用waitpid()
而不是wait()
。
通过在子进程中返回i
或从i
计算的数字,可以使输出更有趣。请注意,在分支循环从1
而不是0
运行之前,如果在命令行中指定4
,则会获得3个子进程和原始父进程。