exec(execl、execlp 等)失败的原因是什么?如果您调用 exec 并且它返回,除了 panic 和调用 exit 之外还有什么最佳实践吗?
最佳答案
处理exec
失败的问题在于,通常exec
是在子进程中执行的,而您想在父进程中进行错误处理。但是你不能只是 exit(errno)
因为(1)你不知道错误代码是否适合退出代码,并且(2)你无法区分失败到 exec
和您exec
的新程序的失败退出代码。
我知道的最佳解决方案是使用管道来传达 exec
的成功或失败:
- 在 fork 之前,在父进程中打开一个管道。
- fork 后,父进程关闭管道的写入端,从读取端读取。
- child 关闭读端,为写端设置close-on-exec标志。
- child 调用 exec。
- 如果 exec 失败,子级使用管道将错误代码写回父级,然后退出。
- 如果子进程成功执行
exec
,父进程读取eof(零长度读取),因为close-on-exec使成功的exec
关闭了写端管道。或者,如果exec
失败,父级读取错误代码并可以相应地继续。无论哪种方式,父级都会阻塞,直到子级调用exec
。 - 父级关闭管道的读取端。
关于c - 什么会导致 exec 失败?接下来发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3703013/