从 C 程序访问退出代码

Accessing exit codes from a c program

我试图在整个实习期间找到解决方案,但论坛一直说这是不可能的,所以我在这里提出我的问题。 shell(任何像 bash 这样的 shell)如何跟踪 exit codes。是通过跟踪他们的子进程吗? (如果是这样,我怎么能在我创建和杀死许多子进程的程序中实现这样的事情)或者是否有一个全局变量相当于 $? 我可以在 c 中访问?还是他们将其存储在文件中?

'wait' 或 'waitpid'.

有了它,您可以跟踪子进程以及它们是如何终止的。

你可以用宏'WEXITSTATUS'检查'wstatus',这是'main'函数的return值(如果以'exit'结束) .

下面是在不存在的路径上执行 grep 并在父路径中获取 return 代码的示例:

代码:

#include <errno.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>


int main(int argc, char* argv[]) {

    pid_t childPid;
    switch(childPid = fork()) {
    case -1:
        fprintf(stderr, "Error forking");
        return 1;
    case 0:
        printf("CHILD: my pid is: %d\n", getpid());
        int ret = execlp(argv[1], argv[1], argv[2], argv[3], (char *) NULL);
        if (ret == -1) {
            printf("CHILD: execv returned: %d\n", errno);
            return errno;
        }
        break;
    default:
        printf("I am the parent with a child: %d\n", childPid);
        int childRet;
        wait(&childRet);
        printf("PARENT, child returned: %d\n", childRet >> 8);
    }
    return 0;
}
 

执行:

# Example of Failure execution:

[ttucker@zim c]$ cc -o Whosebug so.c && ./Whosebug grep test /does/not/exists
I am the parent with a child: 166781
CHILD: my pid is: 166781
grep: /does/not/exists: No such file or directory
PARENT, child returned: 2

# Example of a successful execution:

[ttucker@zim c]$ cc -o Whosebug so.c && ./Whosebug echo foo bar
I am the parent with a child: 166809
CHILD: my pid is: 166809
foo bar
PARENT, child returned: 0