Deprecated: Array and string offset access syntax with curly braces is deprecated in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/inc/init.php on line 542
ja:cpp:shellcommand [GiriWiki]

ユーザ用ツール

サイト用ツール


ja:cpp:shellcommand

Shellコマンドを実行


ナイーブには

  • system 関数 <cstdlib>
  • popen 関数 <cstdio>

を使う2通りがある。
ただコマンドを実行したいだけであればsystem関数を使えば良いが、system関数の返り値はshellの終了ステータスであり、 実行結果の出力を得ることはできない。
コマンドの実行結果を得たい(例えば ls を実行してファイルのリストを得たい)時は popen関数 popen関数はFILEポインタを返り値に持ち、パイプ(コマンドの標準出力)を(仮想の)ファイルとして開く。 それを読み込むことでコマンドの実行結果を得ることができる。

 char *command = "...";//実行したい任意のコマンド
 FILE *pipe;
 char buffer[256];
 if( (pipe = popen(command,"r"))==NULL ){// パイプをopen
    std::cout << "failed." << std::endl;
    return 1;
  }
 
 while( fgets(buffer,sizeof(buffer),pipe)!=NULL ){
    strtok(buffer,"\n\0");// bufferには改行コードが含まれてしまっているのでそれをNULLに置換 (#include <cstring>)
     ....                 
     ....                 // コマンドの標準出力を1行ずつ読んで(bufferに格納)好きな処理を実行
     ....                 
  }
 pclose(pipe); // パイプをclose ※忘れずに!

注意点として、pcloseでストリームを閉じた後にプロセスの終了待ちをしているため、 popenで呼び出したプロセスが終了しないままpcloseしてしまうと、そのプロセスが失敗してしまうらしい。

ja/cpp/shellcommand.txt · 最終更新: 2018/04/12 06:57 by kota