はじめに
system関数を使用することで、C言語でシェルコマンドを実行することができる。
本稿では、system関数の使い方を説明する。
書式
system関数の書式は以下になる。
#include <stdlib.h>
int system(const char *command);
戻り値
- 成功した場合
最後のコマンドの終了ステータス - command が NULL の場合
0以外の値 - シェルが利用不可の場合
0 - 子プロセスを作成できなかった場合
-1 - 子プロセスのステータスを取得できなかった場合
-1 - 子プロセスでシェルを実行できなかった場合
127
使ってみる
以下は、system関数を使用して exit 3 を実行し、その終了コードを取得するプログラムである。
また、正常終了したか否かは、WIFEXITEDマクロで確認でき、
終了コードは、WEXITSTATUSマクロを使用して取得することができる。
#include <stdio.h>
#include <stdlib.h>
int main() {
char *command = "exit 3";
int res;
res = system(command);
printf("%d\n", WIFEXITED(res));
// 1
printf("%d\n", WEXITSTATUS(res));
// 3
return 0;
}
注意
上記のように、WEXITSTATUSマクロを使用しないで終了ステータスを表示しようとすると、期待していない値が出力される。
#include <stdio.h>
#include <stdlib.h>
int main() {
char *command = "exit 3";
int res;
res = system(command);
printf("%d\n", res);
// 768
return 0;
}
上記の値 768 を16進数にすると以下のようになる。
"\x00\x03\x00\x00"
終了ステータスは 0 ~ 255 の 1バイトであるので、第二オクテットに終了ステータスが格納されていることがわかる。
よって、以下のように第二オクテットの1バイトを出力すれば、マクロを使用した時と同じように終了ステータスを出力できる。
printf("%hhd\n", *((char*)(&res)+1));
// 3
0件のコメント