2017-01-13 6 views
1

私はそれがない、すべてが非常に簡単に次のようなシステムコールを使用しようとしている 、シンプルなユーティリティ(カーネル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; 

} 

はまだありません次のログ:

[email protected]_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) 

EDIT

[email protected]_kk:/ # echo hello again && echo $? && echo $0 
hello again 
0 
tmp-mksh 
[email protected]_kk:/ # 

しかし、私は何か面白いもの見つけた:メインをwithing)(test_expanderを呼んで を、それが動作しますOK。だから、おそらくシステムコールが設立されていないバイナリを見つけようとしているのだろうか?

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; 
} 

ありがとうございました。

+0

蘭シェルでagain'リターンハロー '$エコーは何でしょうか?バッファに "hello again"をコピーして、 'system()'に渡してください。 –

+0

何も返しません(それは問題です)。システムコールのようなことはまったくありません:(なぜわからないのですか? – ransh

+0

前のコマンドで述べたように 'echo'を実行した後、 '$?'を意味していましたか? –

答えて

1

システム()、32512小数の戻り値を蘭、ヘク​​スに7F00です。 この値は、/bin/shが実行できない場合、system()の結果である0x7Fと奇妙に似ています。バイトオーダリング(big/little endian)には問題があるようです。非常に奇妙な。

更新:答えを書いているうちに、質問を編集して/system/bin/busyboxについて何かを引っ張った。

おそらく、/bin/shはありません。

だから私良くない/ binに、専用/システム/ binに設立され

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に:

+0

ありがとう、私は同じ時間にそれを得た。 – ransh

1

は、私は、システムのmanページから

を何が起こるかを理解すると思います代わりにexecvを使用してください。

感謝を(それは読み取り専用ですbecuaseファイルシステムを、私は、静的リンクを行うことはできません)、 は

関連する問題