5

system()関数は、呼び出しているプロセスから取得した終了コードの128倍を返しているようです。

マニュアルページから:

戻り値エラーの場合(たとえば、fork(2)が失敗した場合)、返される値は-1であり、それ以外の場合はコマンドの戻りステータスです。

これが私が持っているものです。

$ ls tinker.c
tinker.c
$ echo $?
0
$ ls notexisting
ls: cannot access notexisting: No such file or directory
$ echo $?
2
$ cat tinker.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    printf("%d\n", system("ls tinker.c"));
    printf("%d\n", system("ls notexisting"));
    return 0;
}
$ gcc tinker.c -o tinker
$ ./tinker 
tinker.c
0
ls: cannot access notexisting: No such file or directory
512

最初の呼び出しは、失敗が発生していないことを示していますが、戻りコードは、マニュアルページから読み取っているものとはまったく異なります。私は何が間違っているのですか?

4

3 に答える 3

4

システムのマニュアルページの引用は、関連する部分を見逃しています。

...この後者の戻りステータスは、wait(2)で指定された形式です。したがって、コマンドの終了コードはWEXITSTATUS(status)になります。

コマンドの終了コードを取得するには、戻り値を8だけ右シフトする必要があります(少なくともLinuxでは)。

移植可能なアプローチは、マクロ自体を使用することです。

于 2012-11-18T16:25:36.400 に答える
3

POSIXからsystem(3)

コマンドがnullポインタでない場合、system()は、コマンド言語インタプリタの終了ステータスをwaitpid()で指定された形式で返します。

WEXITSTATUS戻りコードを取得するには、マクロを使用する必要があります。

于 2012-11-18T16:17:28.677 に答える
-1

0と512は、コマンドの終了ステータスです

コマンドが正常に実行された場合は0の値を返し、それ以外の場合はゼロ以外の値を返します。そして、このゼロ以外の値は、OSによって異なります。私のMacOSでは、2番目のsystemコマンドの戻り値は256です。

この質問`ls`の終了ステータスからも回答を得ることができます。

于 2012-11-18T17:01:33.427 に答える