c - 如果 exec() 失败怎么办?

标签 c linux unix ipc fork

假设我们有一段代码做这样的事情:

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/

相关文章:

c++ - 如何使 makefile 中的目标调用 makefile 中的另一个目标

c - 传播多个 make 命令

c - Realloc 在 C 中的实现

c++ - 每个 libstdc++ 版本的 `__GLIBCXX__` 值

PHP scandir() 在 cifs 挂载上失败,直到 php-fpm 重新启动

linux - 如何从命令行删除 unix(Mac OSX) 中名为 "-d"的文件?

c - 全局命名空间中的两个变量,允许同名,如何?

c - 将 C 变量传递给 SQL 命令

c++ - C/C++标准库中的缓冲

c++ - Unix C++ 简单服务器问题 : sending data back to browser