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

Ric*_*ral 17 c fork exec exit

在我的简单自定义shell中,我正在从标准输入中读取命令并使用execvp()执行它们.在此之前,我创建了当前进程的fork,我在该子进程中调用了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...
}
Run Code Online (Sandbox Code Playgroud)

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

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

Nat*_*man 17

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

语法是:

pid_t waitpid(pid_t pid, int *status, int options);
Run Code Online (Sandbox Code Playgroud)

要么

pid_t wait(int *status);
Run Code Online (Sandbox Code Playgroud)

status包含退出状态.查看手册页以了解如何解析它.


请注意,您无法从子进程执行此操作.一旦你调用execvp子进程死亡(所有的实际目的),并更换exec"d过程.你可以到达exit(0)那里的唯一方法是,如果execvp它本身失败,但失败并不是因为新程序结束了.这是因为它永远不会开始.

编辑:子进程并没有真正死掉.PID和环境保持不变,但整个代码和数据都被exec'd进程替换.除非失败,否则您可以指望返回原始子进程exec.

  • @Nazgulled:进程的唯一标准返回值是0/EXIT_SUCCESS和EXIT_FAILURE(stdlib.h).您可以返回其他值,但请记住,只能检索到8个最低有效位. (4认同)