こんにちは
類似の質問がありましたが、本質的には異なっているため
投稿させていただきます。
Cのプログラムから、system関数等をつかってshellスクリプトを起動し
そのスクリプトの返り値をハンドリングする良い方法がわかりません。
自分で思いついた方法が↓です。
実行したいスクリプトが「hoge.sh」の場合
/***********************************/
/* 適当なファイルにリダイレクト */
system("hoge.sh;$?>>temp.txt;");
/* 適当なファイルOpen */
fp = open(temp.txt,"r");
/* スクリプトが終わるまでfgetsをLoop */
fgets(piyo,2,fp);
/***********************************/
というように、不恰好なコーディングにしかなりません。
他にもっと良い方法があればご教授願います。
宜しく御願いします。
No.6
- 回答日時:
No.3 です。
間違えました。他の回答者さんのとおり system() の戻り値に、起動したコマンドで実行された exit(status) の status が帰ります(Linux の場合)。
int ret = system( "hoge.sh" );
で OK です。
どうもありがとうございます。
OSを書き忘れるという致命的なミスをしてしまいました。
すいません。
環境はLinuxではなくUNIX(HP-UX)なもので、system関数ではコマンド起動成否しか取得できないようなのです。
No.5
- 回答日時:
OSが提示されてないので、linuxの前提で、
systemは、shellスクリプトの戻り値を、引継ぎますので、systemの戻り値をそのまま、使用すればよいと思います。また、systemは、shellスクリプトの終了を待ちますので、system呼出し後、特に待つ必要はありません。
systemの完了はshellスクリプトの実行完了を意味します。(もちろん、shellスクリプトをバックグラウンドで実行しないことが前提ですが)
参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man …
なんと!
linuxはそうなのですか!
残念ながら、当方はUNIX(HP-UX)なので異なっているようです。
正常起動されたか否かしかsystemの返り値ではハンドリングできませんでした。
ありがとうございます!
No.4
- 回答日時:
あれ?
system の返り値って使えないんだっけ?
この回答への補足
systemの返り値は、そのコマンドが正常起動されれば、処理系定義の値を返すのです。
つまり
hoge.sh のなかで exit 0 で終了したのか exit 1 で終了したのかは取得できないのです。。
hoge.sh というコマンドが叩けたかどうかの値しか帰ってこないようなのです。。
すいませんでした。
No5の方がおっしゃる通り、Linuxではsystem関数の返り値に実行コマンドの返り値を設定してくれるようです。
私の環境はUNIX(HP-UX)なので、上記補足のような結果となってしまってます。
ありがとうございました。
No.3
- 回答日時:
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" が取得したいのです。
とりあえず試してみます!
ありがとうございました。
No.1
- 回答日時:
こんな調べ方をして見てみると
http://f4.aaa.livedoor.jp/~pointc/log941.html
fork()、exec()、spawnl()、辺りの関数とか
あとはpipeという単語が散見されるから
その辺りから攻めたら良いんじゃないかな
言葉足らずで申し訳ありません。
呼び出すスクリプト(もしくはプログラム)へは手を加えられない、
という制約があります。
確かにfork→execでpipeに書き込んでくれれば助かるのですが。。
ありがとうございます^-^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
「出身中学と出身高校が混ざったような校舎にいる夢を見る」「まぶたがピクピクしてるので鏡で確認しようとしたらピクピクが止まってしまう」など、 これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
C++でシェルを起動
C言語・C++・C#
-
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
char*を初期化したいのですが
C言語・C++・C#
-
-
4
system関数のエラー検出
C言語・C++・C#
-
5
シェルからCで作った実行ファイルを動かすには?
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
awkの処理速度を改善したい
-
パーミッション600でもブラウザ...
-
Cからシェルを起動し返り値をハ...
-
vba userFormのSubを標準モジュ...
-
エクセルVBAでシートモジュール...
-
Excel VBAで、ユーザーフォーム...
-
LCD ディスプレイを Raspberry ...
-
例外処理のフローチャートの記...
-
印刷後メッセージボックスを表...
-
VBAで別モジュールへの変数の受...
-
perlをバージョンアップしたら...
-
【vba】フォームに書いてあ...
-
perlのsystem関数内でのコロン...
-
perl 「予定」が「嵐閧オ」に...
-
標準モジュールを削除したい。(...
-
モジュールモードとFastCGI
-
配列と互換性のない型の要素に...
-
VBSがコンパイルエラーになりま...
-
Excel VBAで、ユーザーフォー...
-
ブログなどのHTMLソース内の<{ ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Cからシェルを起動し返り値をハ...
-
powershellで関数名を変更する...
-
Perlのライセンス
-
cygwinでcshが認識されず困って...
-
VBScriptでCurrentDirectoryを...
-
awkの処理速度を改善したい
-
UWSCのスクリプトにラグが発生...
-
Perlスクリプトで文字化けして...
-
ADサーバにおけるログインID,PC...
-
VBSを利用して、IEのタブを自動...
-
"JScript"が見つかりません!
-
vbs: オブジェクトがコレクショ...
-
CシェルプログラミングをCygwinで?
-
VBSで自動ログインについて
-
[ASP]条件によってインクルード...
-
シェルでsyntax errorがでてしまう
-
Postfixでメールを受信したらPe...
-
pythonスクリプトの停止方法に...
-
Linuxのcronとrc.localでの制御...
-
perlスクリプトのブラウザURLか...
おすすめ情報