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

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
ja:cpp:shellcommand [2017/06/02 02:45]
kota
ja:cpp:shellcommand [2018/04/12 06:57] (現在)
kota
ライン 2: ライン 2:
  
 ---- ----
- +ナイーブには 
- +  * system 関数 <​cstdlib>​ 
-パイプ(コマンドの標準出力)を(仮想の)ファイルとして開き、それを読み込むことでコマンドの実行結果を得ることができる。+  * popen 関数 <​cstdio>​ 
 +を使う2通りがある。\\ 
 +ただコマンドを実行したいだけであればsystem関数を使えば良いが、system関数の返り値はshellの終了ステータスであり、 
 +実行結果の出力を得ることはできない。\\ 
 +コマンドの実行結果を得たい(例えば ls を実行してファイルのリストを得たい)時は popen関数 
 +popen関数はFILEポインタを返り値に持ち、パイプ(コマンドの標準出力)を(仮想の)ファイルとして開く。 
 +それを読み込むことでコマンドの実行結果を得ることができる。
  
 <code cpp> <code cpp>
- char *command = "​...";​+ char *command = "​...";​//​実行したい任意のコマンド
  FILE *pipe;  FILE *pipe;
  char buffer[256];​  char buffer[256];​
ライン 16: ライン 22:
  
  ​while( fgets(buffer,​sizeof(buffer),​pipe)!=NULL ){  ​while( fgets(buffer,​sizeof(buffer),​pipe)!=NULL ){
-    strtok(buffer,"​\n\0"​);//​ bufferには改行コードが含まれてしまっているのでそれをNULLに置換+    strtok(buffer,"​\n\0"​);//​ bufferには改行コードが含まれてしまっているのでそれをNULLに置換 ​(#include <​cstring>​)
      ​.... ​                      ​.... ​                
-     ​.... ​                // コマンドの標準出力を1行ずつ読んで処理を実行+     ​.... ​                // コマンドの標準出力を1行ずつ読んで(bufferに格納)好きな処理を実行
      ​.... ​                      ​.... ​                
   }   }
- ​pclose(pipe);​ // パイプをclose+ ​pclose(pipe);​ // パイプをclose ​※忘れずに!
 </​code>​ </​code>​
  
 +注意点として、[[http://​panda.holy.jp/​2014/​07/​312/​|pcloseでストリームを閉じた後にプロセスの終了待ちをしている]]ため、 
 +popenで呼び出したプロセスが終了しないままpcloseしてしまうと、そのプロセスが失敗してしまうらしい。
ja/cpp/shellcommand.1496371551.txt.gz · 最終更新: 2017/06/02 02:45 by kota