我想知道为什么waitpid()在存在fopen()时返回-1。

FILE *fp = fopen ("abc.txt", "r");
fclose(fp);

pid_t pid = fork ();
if (pid == 0) { /* child process */
    printf ("child %d\n", getpid());
}
else {                  /* parent process */
    pid_t pid2 = waitpid (pid);
    printf ("parent %d\n", pid2);
}


从上面的示例中,pid2等于-1,但是如果我消除了pid,它将变为与fopen()(子进程编号)相同的数字。
感谢您的澄清!

最佳答案

您正在忽略该错误,因此无法分辨。

我最好的猜测是,您的waitpid呼叫被死孩子的CHLD信号打断了。

测试错误代码以确保:

int status;
pid_t pid2;
while ((p = waitpid(pid, &status, 0)) == -1)
{
    printf("waitpid error: %s\n", strerror(errno));
}
printf("reaped child: %d\n", pid2);


如果您不关心SIGCHLD,请在进行分叉之前先阻止信号。

关于c - 如果fopen()存在,则waitpid()返回-1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26476274/

10-12 23:56