system関数でコマンド実行の結果を返り値として取得する方法をネットで検索するとforkやexecする方法が大量に出てきますが、実行するOSによって出来ないこともしばしばある。
いっその事、Linuxでは確実に且つ簡単に行う方法を考えて、コマンド実行をtempファイルに出力してそれをファイル取得する方法が一番簡易で確実なのではないかと考えてみた。
その後ファイル読み込みを変数に格納してファイルを削除すれば、コマンド実行結果をC言語内で取得できる事になる。
返り値の整形は当たり前だがC言語内で行えばいい。
コマンドラインから実行できる他ツールとの連携もほぼこのやり方でできるので、非常に使い勝手が良い。
ソースコード
cmd.c
#include <stdio.h>
#include <stdlib.h>
#define SIZE (1024*1024)
main(int argc, char **argv){
char *path;
if(!argv[1]){
path = "./";
}
else{
path = argv[1];
}
// init
FILE *file;
char line[SIZE];
char *tmpFile = "cmd.tmp";
// Command
char cmd[100] = "ls -lha";
sprintf(cmd, "%s %s> %s", cmd,path,tmpFile);
int res = system(cmd);
// Tmp-file-Load
file = fopen(tmpFile, "r");
int i=0;
while(fgets(line, SIZE, file)!=NULL){
printf("[%d] %s", i, line);
i++;
}
fclose(file);
//Tmp-file-remove
remove(tmpFile);
}
実行
$ gcc -o cmd.app cmd.c
$ ./cmd.app /home
解説
今回はlsコマンドの結果をC言語で受け取ってます。
argvは、アプリ実行の際に受け渡し値として、lsの対象階層を受け渡せます。
※階層指定がない場合は「./」として実行階層を受け渡します。
lsコマンド以外で対応したい場合は直接記述してもいいし、受け渡し値のargvに仕組みを作ることでも対応できると思います。
※この辺はセルフでお願いします。
このスニペットでかなりプログラムで対応できる幅が広がりました。
得意な言語で細かな処理を書いてC言語でまとめる・・・とか
高速に行いたい箇所のみC言語で記述するとか。
0 件のコメント:
コメントを投稿