gpt4 book ai didi

c - 如何退出子进程并从 execvp() 返回其状态?

转载 作者:太空狗 更新时间:2023-10-29 16:32:18 25 4
gpt4 key购买 nike

在我简单的自定义 shell 中,我从标准输入读取命令并使用 execvp() 执行它们。在此之前,我创建了当前进程的一个分支,并在该子进程中调用了 execvp(),紧接着,我调用了 exit(0)。

像这样:

pid = fork();

if(pid == -1) {
perror("fork");
exit(1);
}

if(pid == 0) {
// CHILD PROCESS CODE GOES HERE...
execvp(pArgs[0], pArgs);
exit(0);
} else {
// PARENT PROCESS CODE GOES HERE...
}

现在,使用 execvp() 运行的命令可以返回错误,对吗?我现在想正确处理它,我总是调用 exit(0),这意味着子进程将始终处于“OK”状态。

如何从 execvp() 调用中返回正确的状态并将其放入 exit() 调用中?我是否应该只获取 execvp() 返回的 int 值并将其作为 exit() 参数而不是 0 传递。这是否足够正确?

最佳答案

需要在父代码中使用waitpid(3)wait(1)等待子进程退出并获取错误信息。

语法是:

pid_t waitpid(pid_t pid, int *status, int options);

pid_t wait(int *status);

status 包含退出状态。看man pages看看你如何解析它。


请注意,您不能从子进程执行此操作。一旦您调用 execvp,子进程就会死亡(出于所有实际目的)并被替换 exec 的进程。到达 exit(0) 的唯一方法是 execvp 本身失败,但失败不是因为新程序结束。这是因为它从未开始运行。

编辑:子进程并没有真的死掉。 PID 和环境保持不变,但整个代码和数据被替换为 exec 的进程。您可以指望不会返回到原始子进程,除非exec 失败。

关于c - 如何退出子进程并从 execvp() 返回其状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/903864/

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