アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは
類似の質問がありましたが、本質的には異なっているため
投稿させていただきます。

Cのプログラムから、system関数等をつかってshellスクリプトを起動し
そのスクリプトの返り値をハンドリングする良い方法がわかりません。

自分で思いついた方法が↓です。

実行したいスクリプトが「hoge.sh」の場合
/***********************************/
/* 適当なファイルにリダイレクト */
system("hoge.sh;$?>>temp.txt;");

/* 適当なファイルOpen */
fp = open(temp.txt,"r");

/* スクリプトが終わるまでfgetsをLoop */
fgets(piyo,2,fp);
/***********************************/
というように、不恰好なコーディングにしかなりません。

他にもっと良い方法があればご教授願います。
宜しく御願いします。

A 回答 (7件)

やりたくないけど自力で fork&exec (&wait) かなぁ?


ライセンスに問題なければ glibc からコピーしてもいいけど.
    • good
    • 0
この回答へのお礼

上記のほかに、popen等試しました。
結果的にはリダイレクト→ファイル読み込みが一番実装として簡単であったため、そのように記述いたしました。
いろいろとアドバイスをありがとうございました。

お礼日時:2008/02/14 12:11

No.3 です。

間違えました。

他の回答者さんのとおり system() の戻り値に、起動したコマンドで実行された exit(status) の status が帰ります(Linux の場合)。

int ret = system( "hoge.sh" );

で OK です。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
OSを書き忘れるという致命的なミスをしてしまいました。
すいません。
環境はLinuxではなくUNIX(HP-UX)なもので、system関数ではコマンド起動成否しか取得できないようなのです。

お礼日時:2008/01/24 14:26

OSが提示されてないので、linuxの前提で、


systemは、shellスクリプトの戻り値を、引継ぎますので、systemの戻り値をそのまま、使用すればよいと思います。また、systemは、shellスクリプトの終了を待ちますので、system呼出し後、特に待つ必要はありません。
systemの完了はshellスクリプトの実行完了を意味します。(もちろん、shellスクリプトをバックグラウンドで実行しないことが前提ですが)

参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man …
    • good
    • 0
この回答へのお礼

なんと!
linuxはそうなのですか!
残念ながら、当方はUNIX(HP-UX)なので異なっているようです。
正常起動されたか否かしかsystemの返り値ではハンドリングできませんでした。
ありがとうございます!

お礼日時:2008/01/24 14:22

あれ?


system の返り値って使えないんだっけ?

この回答への補足

systemの返り値は、そのコマンドが正常起動されれば、処理系定義の値を返すのです。
つまり
hoge.sh のなかで exit 0 で終了したのか exit 1 で終了したのかは取得できないのです。。
hoge.sh というコマンドが叩けたかどうかの値しか帰ってこないようなのです。。

補足日時:2008/01/24 14:14
    • good
    • 1
この回答へのお礼

すいませんでした。
No5の方がおっしゃる通り、Linuxではsystem関数の返り値に実行コマンドの返り値を設定してくれるようです。
私の環境はUNIX(HP-UX)なので、上記補足のような結果となってしまってます。
ありがとうございました。

お礼日時:2008/01/24 14:24

Unix 系、というか Windows は知らない、ならば、popen() を使えばいいと思います。



FILE *fp = popen("hoge.sh", "r");

とすると hoge.sh の stdout が pipe でつながって、その pipe への FILE* が fp に帰ってきますので、後は fp を適当に fgets() なりすればいいと思います。

こうするとファイルを作らなくて済みますし、ファイルを消すという後片付けも不要になります。

そうそう、終了したら pclose(fp) を呼びます。詳しくは man 3 popen を見てください。

この回答への補足

まだ手元で試していないのですが、stdoutが欲しいのではなく、
hoge.sh内の最後に書かれている「exit 1」の "1" が取得したいのです。
とりあえず試してみます!
ありがとうございました。

補足日時:2008/01/24 14:12
    • good
    • 0

環境変数に値をこめてgetenv()で参照というのはどうでしょう?



シェルプロセスを考えて、環境変数の定義位置は決めて下さい。
    • good
    • 0
この回答へのお礼

言葉足らずで申し訳ありません。
No1の方にも申し上げましたが、
呼び出すスクリプト(もしくはプログラム)へは手を加えられない、
という制約があるのです。
下手するとシステムコマンドがまんまの場合も考えられる状況でして、環境変数への退避が可能だと、下手なOpen/Closeがなくなるのでいいのですが><

ご助言ありがとうございます!

お礼日時:2008/01/18 16:46

http://www.google.co.jp/search?hl=ja&q=c%E8%A8%8 …
こんな調べ方をして見てみると

http://f4.aaa.livedoor.jp/~pointc/log941.html
fork()、exec()、spawnl()、辺りの関数とか
あとはpipeという単語が散見されるから
その辺りから攻めたら良いんじゃないかな
    • good
    • 0
この回答へのお礼

言葉足らずで申し訳ありません。
呼び出すスクリプト(もしくはプログラム)へは手を加えられない、
という制約があります。
確かにfork→execでpipeに書き込んでくれれば助かるのですが。。

ありがとうございます^-^

お礼日時:2008/01/18 16:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています