system()返回错误的值

时间:2014-03-21 18:46:34

标签: 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("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

所以怀疑以下某个地方正在某个地方发生:

  1. 字节顺序正在交换
  2. 该值被移位8位
  3. 正在使用不兼容的结构定义
  4. 当我运行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。有没有人见过这种类型的行为或有任何想法(可能是特定于架构的)在哪里看?

2 个答案:

答案 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中的退出状态代码)。

Are there any standard exit status codes in Linux?