假设我们有一个代码做这样的事情:
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 本身,例如,如果第一个参数引用的文件未找到或不可执行。