【发布时间】:2020-10-28 11:00:36
【问题描述】:
我正在尝试使用 posix_spawn() 创建一个新的子进程。 子进程启动后,调用者进程应该继续运行。
TLDR:为什么即使子可执行文件的路径无效(不存在),posix_spawn() 也会返回 0(成功)?在这种情况下以及 posix_spawn 实际失败但返回成功的任何其他情况下,如何正确检测错误?
我尝试了以下代码。
/* The CALLER process*/
int main(int argc, char *argv) {
int status, pid;
printf("CALLER - Start\n");
char *args[] = {"/home/<user>/child_exec", NULL};
status = posix_spawn(&pid, args[0], NULL, NULL, args, environ);
printf("Status: %d; PID: %d\n", status, pid);
printf("CALLER - End\n");
return 0;
}
/* The CHILD process */
int main() {
printf("From CHILD\n");
return 0;
}
当我使用正确子可执行文件的路径运行调用程序时,它会按预期运行。 posix_spawn 的状态为 0,子进程的字符串被打印出来。
CALLER - Start
Status: 0; PID: 5110
CALLER - End
From CHILD
现在,当我使用无效的子可执行路径(例如 /home/user/child_exec123)运行同一程序时,即使子进程尚未执行,它仍然返回状态 0。
CALLER - Start
Status: 0; PID: 5251
CALLER - End
对于这种子路径不存在的情况,我可以在调用 posix_spawn() 之前检查文件是否存在。 但是,如果还有其他类似的错误,其中 posix_spawn() 实际失败但返回 0 怎么办?我如何发现是否有错误?
【问题讨论】:
-
奇怪的是 IBM 的 AIX 中的实现是理智的——它会在例如以下情况下返回失败。可执行文件不存在。我非常希望(对于 LINUX)最终不再需要克隆调用进程只是为了立即浪费结果。但出于某种我无法理解的原因,这仍然是 2021 年的标准做法!
标签: c++ c linux multiprocessing posix