Embedded 返回错误值的系统()

Embedded 返回错误值的系统(),embedded,arm,embedded-linux,Embedded,Arm,Embedded Linux,我有一个运行嵌入式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("Re

我有一个运行嵌入式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);
};
值“10752”由system()返回,而不是“42”。10752左移8时为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
wait4()返回正确的状态(si_status=42),但当它被打印到标准输出时,该值被移位8位,看起来就像是在库中发生的一样。有趣的是,写入操作返回的值为42。我想知道这是否是一个关于正在发生什么的暗示

不幸的是,我无法让ltrace在设备上编译和运行。以前有没有人见过这种行为,或者有什么想法(可能是特定于架构的)可以去哪里看

$man 3系统

返回值

错误时返回的值为-1(例如,fork(2)失败),并且 否则返回命令的状态。后一种返回状态为 以wait(2)中指定的格式因此,命令的退出代码 将是WEXITSTATUS(状态)

2美元等等

WEXITSTATUS(status)返回子级的退出状态。这 由状态参数的最低有效8位组成 在对退出(3)或_退出(2)的调用中指定的子级,或作为 main()中返回语句的参数。此宏应仅为 如果WIFEXITED返回true,则使用


我认为退出代码不同于返回值,并且特定于操作系统

当您使用代码调用“exit”时,Linux会执行以下操作


(错误代码&0xff)您有标准库的源代码吗?似乎
系统
的定义是显而易见的起点。我猜它对如何从wait4结果中提取
si_status
位做出了错误的假设。
system
的返回值是实现定义的,因此只有当它与C库文档所说的不同时才是“不正确的”@auselen的回答似乎是适当的,如果有点简洁的话。当我在第一个printf调用中将“ret”替换为“WEXITSTATUS(ret)”时,正确的值出现在标准输出中。它一直在手册页上。。。谢谢
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 /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 +++
SYSCALL_DEFINE1(exit, int, error_code)
{
        do_exit((error_code&0xff)<<8);
}