この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
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してしまうと、そのプロセスが失敗してしまうらしい。 | ||