c - 什么会导致 exec 失败?接下来发生什么?

标签 c linux unix exec

exec(execl、execlp 等)失败的原因是什么?如果您调用 exec 并且它返回,除了 panic 和调用 exit 之外还有什么最佳实践吗?

最佳答案

处理exec失败的问题在于,通常exec是在子进程中执行的,而您想在父进程中进行错误处理。但是你不能只是 exit(errno) 因为(1)你不知道错误代码是否适合退出代码,并且(2)你无法区分失败到 exec 和您exec 的新程序的失败退出代码。

我知道的最佳解决方案是使用管道来传达 exec 的成功或失败:

  1. 在 fork 之前,在父进程中打开一个管道。
  2. fork 后,父进程关闭管道的写入端,从读取端读取。
  3. child 关闭读端,为写端设置close-on-exec标志。
  4. child 调用 exec。
  5. 如果 exec 失败,子级使用管道将错误代码写回父级,然后退出。
  6. 如果子进程成功执行exec,父进程读取eof(零长度读取),因为close-on-exec使成功的exec关闭了写端管道。或者,如果 exec 失败,父级读取错误代码并可以相应地继续。无论哪种方式,父级都会阻塞,直到子级调用 exec
  7. 父级关闭管道的读取端。

关于c - 什么会导致 exec 失败?接下来发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3703013/

相关文章:

c - 为什么我不能调用我的函数(C)?

c - 函数未在此范围内声明

php - 除非我关闭 mysqli 连接,否则连续查询不会运行

c++ - Makefile:对 'std::...' 的 undefined reference

linux - zsh 中的命令替换

c - 处理进程间大文件的 mmap 和 fread

iphone - memcpy 导致 'exc bad access'

c - linux中发送UDP套接字-C语言

java - 当 bash 脚本通过 Java 代码运行时,如何在 Linux 中将用户设置为 root

regex - sed替换多个xml标签