我有一个运行嵌入式Linux的基于ARM的设备,我观察到当我使用C库的 system()调用时,返回代码不正确。这是一个演示行为的测试程序:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int ret = system("exit 42");
printf("Should return 42 for system() call: %d\n", ret);
printf("Returning 43 to shell..\n");
exit(43);
};
以下是设备上的程序输出:
# returnCodeTest
Should return 42 for system() call: 10752
Returning 43 to shell..
价值&#34; 10752&#34;由system()而不是&#34; 42&#34;返回。当左移8:时,10752是42
Python 2.7.3 (default, Feb 27 2014, 20:00:17)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 42<<8
10752
所以怀疑以下某个地方正在某个地方发生:
当我运行strace时,我看到以下内容:
# strace /usr/bin/returnCodeTest
...
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x4001e308) = 977
wait4(977, [{WIFEXITED(s) && WEXITSTATUS(s) == 42}], 0, NULL) = 977
rt_sigaction(SIGINT, {SIG_DFL, [], 0x4000000 /* SA_??? */}, NULL, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], 0x4000000 /* SA_??? */}, NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=977, si_status=42, si_utime=0, si_stime=0} ---
fstat64(1, {st_mode=S_IFCHR|0622, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4001f000
write(1, "Should return 42 for system() ca"..., 42Should return 42 for system() call: 10752
) = 42
write(1, "Returning 43 to shell..\n", 24Returning 43 to shell..
) = 24
exit_group(43) = ?
+++ exited with 43 +++
wait4()返回正确的状态(si_status = 42),但是当它打印到标准输出时,该值会移动8位,看起来它正在库中发生。有趣的是,写入返回值为42.我想知道这是否暗示正在发生的事情......
不幸的是我无法在设备上编译和运行ltrace。有没有人见过这种类型的行为或有任何想法(可能是特定于架构的)在哪里看?
答案 0 :(得分:1)
$ man 3 system
返回值
错误时返回的值为-1(例如,fork(2)失败),并且 否则返回命令的状态。后者的返回状态是 以wait(2)中指定的格式。 因此,命令的退出代码 将是WEXITSTATUS(状态)。
$ man 2等待
WEXITSTATUS(status)返回子项的退出状态。这个 由状态参数的最低有效8位组成 在调用exit(3)或_exit(2)或作为调用时指定的子节点 main()中return语句的参数。这个宏应该只是 如果WIFEXITED返回true,则使用。
答案 1 :(得分:0)
我认为退出代码与返回值不同,并且特定于操作系统。
当你打电话给&#34;退出&#34>时,Linux会执行以下操作:用代码。(适用ERROR_CODE&安培; 0xff的)LT;&LT; 8 强>
SYSCALL_DEFINE1(exit, int, error_code)
{
do_exit((error_code&0xff)<<8);
}
请查看以下链接(Linux中的退出状态代码)。