この文書の現在のバージョンと選択したバージョンの差分を表示します。
次のリビジョン | 前のリビジョン | ||
ja:cpp:shellcommand [2017/06/02 02:44] 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してしまうと、そのプロセスが失敗してしまうらしい。 |