假设我们有一段代码做这样的事情:
int pipes[2];
pipe(pipes);
pid_t p = fork();
if(0 == p)
{
dup2(pipes[1], STDOUT_FILENO);
execv("/path/to/my/program", NULL);
...
}
else
{
//... parent process stuff
}
如你所见,它正在创建一个管道, fork 并使用管道读取子进程的输出(我不能在这里使用 popen
,因为我还需要子进程的 PID其他用途)。
问题是,如果在上面的代码中,execv
失败了怎么办?我应该调用 exit() 还是 abort()?据我所知,这些函数会关闭打开的文件描述符。由于 fork
进程继承了父进程的文件描述符,是否意味着父进程使用的文件描述符将变得不可用?
UPD
我想强调的是,问题不在于 exec() 加载的可执行文件失败,而在于 exec 本身,例如如果第一个参数引用的文件未找到或不可执行。
最佳答案
您应该使用 exit(int)
,因为父进程可以使用 waitpid()
读取参数的(低字节)。这使您可以在父进程中适本地处理错误。根据您的程序执行的操作,您可能希望使用 _exit
而不是 exit
。区别在于 _exit
不会运行用 atexit
注册的函数,也不会刷新 stdio 流。
关于c - 如果 exec() 失败怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11215842/