为什么系统调用失败?

时间:2017-01-13 08:55:22

标签: linux shell sh

我尝试编译简单实用程序(内核3.4.67),其中 它只是尝试使用系统调用非常简单如下:

int main(void)
{
   int rc;

   printf("hello 1\n");

   rc = system("echo hello again");
   printf("system returned %d\n",rc);
   rc = system("ls -l");
   printf("system returned %d\n",rc);

  return 0;

}

然而,系统调用失败,您可以在以下日志中看到:

root@w812a_kk:/ # /sdcard/test
hello 1
system returned 32512
system returned 32512

我将其编译为以下

arm-linux-gnueabihf-gcc   -s -static  -Wall -Wstrict-prototypes test.c -o test

这真的很奇怪,因为我过去在不同的linux中使用过系统,从来没有遇到任何问题。 我甚至尝试了另一个交叉cpompiler但我也遇到了同样的失败。

内核版本&交叉编译器

# busybox  uname -a
   Linux localhost 3.4.67 #1 SMP PREEMPT Wed Sep 28 18:18:33 CST 2016 armv7l GNU/Linux

arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1-4.7-2013.03-20130313 - Linaro GCC 2013.03) 4.7.3 20130226 (prerelease)

修改

root@w812a_kk:/ # echo hello again && echo $? && echo $0
hello again
0
tmp-mksh
root@w812a_kk:/ #

但我确实找到了一些有趣的东西: 在使用main调用test_expander()时,它可以正常工作。所以我怀疑也许系统调用试图找到一个没有建立的二进制文件?

int test_expander(void)
{
  pid_t pid;
     char *const parmList[] = {"/system/bin/busybox", "echo", "hello", NULL};

     if ((pid = fork()) == -1)
        perror("fork error");
     else if (pid == 0) {
        execv("/system/bin/busybox", parmList);
        printf("Return not expected. Must be an execv error.n");
     }
    return 0;
}

谢谢你的任何想法。

2 个答案:

答案 0 :(得分:1)

system()的返回值,十进制32512,是十六进制的7F00。 此值与0x7F非常相似,如果/bin/sh无法执行,则为0x(系统)的结果。似乎字节排序存在一些问题(大/小端)。很奇怪。

更新:在撰写答案时,您编辑了问题并提取了有关/system/bin/busybox

的内容

可能你根本就没有/bin/sh

答案 1 :(得分:1)

我想我明白会发生什么

从系统手册页:

 The system() library function uses fork(2) to create a child process
       that executes the shell command specified in command using execl(3)
       as follows:

           execl("/bin/sh", "sh", "-c", command, (char *) 0);

但是在我的文件系统sh中只建立/ system / bin,而不是在/ bin

所以我最好只使用execv。 (我不能做静态链接,因为它是只读文件系统)

谢谢, 然