[C言語] system関数の結果取得を簡易に行う

2016年3月22日

C言語 テクノロジー プログラミング

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言語で記述するとか。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。