gpt4 book ai didi

c++ - posix_spawn() : Problem with error handling when using posix_spawn()

转载 作者:行者123 更新时间:2023-12-01 14:36:39 25 4
gpt4 key购买 nike

我正在尝试使用 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 的错误怎么办?我如何发现是否有错误?

最佳答案

来自手册页(特别是第二段):

RETURN VALUE
Upon successful completion, posix_spawn() and posix_spawnp() place the
PID of the child process in pid, and return 0. If there is an error
before or during the fork(2), then no child is created, the contents of
*pid are unspecified, and these functions return an error number as de‐
scribed below.

Even when these functions return a success status, the child process
may still fail for a plethora of reasons related to its pre-exec() ini‐
tialization. In addition, the exec(3) may fail. In all of these
cases, the child process will exit with the exit value of 127.

您需要使用 wait* 函数之一来检查您的子进程的结果。无论如何,这都是个好主意,否则你就会变成僵尸。

关于c++ - posix_spawn() : Problem with error handling when using posix_spawn(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62787927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com