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
====== Shellコマンドを実行 ======
----
ナイーブには
* system 関数
* popen 関数
を使う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 )
....
.... // コマンドの標準出力を1行ずつ読んで(bufferに格納)好きな処理を実行
....
}
pclose(pipe); // パイプをclose ※忘れずに!
注意点として、[[http://panda.holy.jp/2014/07/312/|pcloseでストリームを閉じた後にプロセスの終了待ちをしている]]ため、
popenで呼び出したプロセスが終了しないままpcloseしてしまうと、そのプロセスが失敗してしまうらしい。