こんにちは
類似の質問がありましたが、本質的には異なっているため
投稿させていただきます。
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で質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) FPGA構成データ、ソフトウェアデータ をボード Zybo Z20 用に転送する方法 1 2023/07/25 18:19
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- UNIX・Linux shellscript内のコマンドを、sudo(toor)として実行 2 2022/09/23 15:05
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- PHP PHPでテキストファイルに保存した時の改行問題 1 2022/11/19 15:07
- Mac OS MacOSのLaunchAgentsってなんですか?使い方など教えてください。 前の質問でLaunc 1 2022/04/24 02:06
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
C++でシェルを起動
C言語・C++・C#
-
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
systemの戻り値を取得する方法
C言語・C++・C#
-
-
4
system関数でのシェル起動について
C言語・C++・C#
-
5
system関数のエラー検出
C言語・C++・C#
-
6
C言語 exitの使い方
C言語・C++・C#
-
7
shシェルスクリプト 空白行の入れ方
その他(プログラミング・Web制作)
-
8
system関数を使用してsuコマンドを実行したいのですが
C言語・C++・C#
-
9
system関数がうまくいかない
C言語・C++・C#
-
10
【gcc・cygwin】multiple definitionエラーの解決法
C言語・C++・C#
-
11
マウントしたディスクにcpで、所有者などがコピーできない。
その他(開発・運用・管理)
-
12
C言語初心者の質問失礼します。
C言語・C++・C#
-
13
初級者の質問――time_tについて
C言語・C++・C#
-
14
system関数(Windows)の戻り値!!
C言語・C++・C#
-
15
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
16
popen について
PHP
-
17
シェルスクリプトでFTPの実行結果を取得するには
その他(プログラミング・Web制作)
-
18
C言語 ファイルの指定された行を表示
C言語・C++・C#
-
19
switch文のエラーについて
C言語・C++・C#
-
20
Linuxでフォルダ内全ファイル名の読み込み
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlスクリプトのブラウザURLか...
-
吉里吉里で条件分岐が上手くい...
-
ソースの変更を実行中のソフト...
-
awkの処理速度を改善したい
-
ユーザー定義関数に#NAME?が返...
-
NET::POP3の代用できるスクリプト
-
モジュールは設置するだけでは...
-
どなたか教えてください
-
VBAで旧字体を異字体に一括で変...
-
サブルーチンを使った再帰的な...
-
perlでchasen
-
モジュールとは何ですか
-
Excel VBA 標準モジュール内で...
-
大量の標準モジュールを解放す...
-
Net::SSH::Perlについて
-
フォームから送られてきた文字...
-
ある書籍で、見つけました、per...
-
perl 正規表現でエラー
-
エクセルVBAでシートモジュール...
-
ユーザーフォームに最小化・最...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Cからシェルを起動し返り値をハ...
-
powershellで関数名を変更する...
-
Perlのライセンス
-
awkの処理速度を改善したい
-
perlスクリプトのブラウザURLか...
-
CシェルプログラミングをCygwinで?
-
cygwinでcshが認識されず困って...
-
vbs: オブジェクトがコレクショ...
-
"JScript"が見つかりません!
-
インタプリタ言語とスプリクト言語
-
UWSCのスクリプトにラグが発生...
-
[ASP]条件によってインクルード...
-
ドル記号+アルファベット
-
DBファイルが0644になってしまう
-
VBSを利用して、IEのタブを自動...
-
Perlから2chに書き込むには?
-
ADサーバにおけるログインID,PC...
-
ディスクの空き容量を求める(W...
-
下階層のファイルを含めての最...
-
VBScriptでCurrentDirectoryを...
おすすめ情報