はじめに

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件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です