【发布时间】:2014-05-06 00:53:35
【问题描述】:
如果我在可能需要一些时间才能完成的子进程中使用execl,我什么时候需要使用waitpid?
当我在父级中使用waitpid 时,它告诉我子级正在运行,因为waitpid 的返回值为0。但是,如果我在另一个函数中调用waitpid 一段时间后,它会返回- 1 将errno 设置为ECHILD。如果我不确定孩子是否完成了,我应该在什么时候使用waitpid?
//pid_t Checksum_pid = fork();
Checksum_pid = fork();
if (Checksum_pid == 0)
{
execl(path, name, argument as needed, ,NULL);
exit(EXIT_SUCCESS);
}
else if (Checksum_pid > 0)
{
pid_t returnValue = waitpid(Checksum_pid, &childStatus, WNOHANG);
if ( returnValue > 0)
{
if (WIFEXITED(childStatus))
{
printf("Exit Code: _ WEXITSTATUS(childStatus)") ;
}
}
else if ( returnValue == 0)
{
//Send positive response with routine status running (0x03)
printf("Child process still running") ;
}
else
{
if ( errno == ECHILD )
{
printf(" Error ECHILD!!") ;
}
else if ( errno == EINTR )
{
// other real errors handled here.
printf(" Error EINTR!!") ;
}
else
{
printf("Error EINVAL!!") ;
}
}
}
else
{
/* Fork failed. */
printf("Fork Failed") ;
}
【问题讨论】:
-
exit(EXIT_SUCCESS);后面的execl()是错误的指示符;如果execl()返回,它就失败了,所以你真的应该用exit(EXIT_FAILURE);退出,让父进程知道你失败了。 -
当我尝试在 execl 之上和 execl 之下的子进程中使用 printf 时。我无法得到任何指纹......我不知道为什么。我认为在 execl 之上我应该得到打印。我在写吗?如果 execl 成功,那么如何退出子进程来终止它?如果我不在父进程中使用waitpid(在某些执行后在其他函数中的某个位置),那么使用与我在父进程中获得的第一个参数相同的childpid的waitpid是否有效?
标签: c linux fork waitpid os.execl