【发布时间】:2012-06-26 21:00:06
【问题描述】:
假设我们有一个代码做这样的事情:
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
}
正如你所看到的,它正在创建一个管道,分叉并使用管道来读取子进程的输出(我不能在这里使用popen,因为我还需要子进程的 PID 用于其他目的)。
问题是,如果在上面的代码中,execv 失败了怎么办?我应该调用 exit() 还是 abort()?据我所知,这些函数关闭了打开的文件描述符。既然fork-ed进程继承了父进程的文件描述符,是不是意味着父进程使用的文件描述符会变得不可用?
UPD
我想强调的是,问题不在于 exec() 加载的可执行文件失败,而是 exec 本身,例如以防第一个参数引用的文件未找到或不可执行。
【问题讨论】:
-
如果你不想要一个混乱的控制流,我建议 exit() 在失败的 exec 上使用已知的退出代码。
-
大家好,但是如果
exit()也失败了怎么办? -
我不认为这应该是一个问题 -
atexit函数中发生的任何有趣的事情在最坏的情况下都会导致异常终止,否则我们无法控制它(退出永远不会返回)。