从 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
我试图在整个实习期间找到解决方案,但论坛一直说这是不可能的,所以我在这里提出我的问题。 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