• ベストアンサー

system関数のエラー検出

UNIXのmanで調べたところ、system関数(コマンド)はエラー時、-1をかえし、errnoに"EAGAIN","EINTR","ENOMEN"を代入するようなのですが、 実際にプログラムにくみこんでみると、1を返しているようです。 (systemで実行するコマンド名をわざと間違えて実行しています。) これでは、systemで実行しようとしているコマンドが1を返しているのか、systemでエラーが起きているのか判断できません。 どのように判定すればよいのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Fooky
  • ベストアンサー率71% (59/82)
回答No.2

atonさんの仰る通り、shのステータスでしょう。 Solarisのmanページには、 "If the fork() or exec() fails, system() returns a value of -1 and sets errno." とありますし、Linuxでは、 ”execve() が /bin/sh を呼び出すのに失敗した時には 127 を、 別のエラーがあった時には -1 を、それ以外の時はコマンドの 返り値を返す。” とあります。 このように、system()は返り値1に特別な意味を もたせてないですから、system()から1が返った ということは、shか或はshが呼び出したコマンドから 1が返ったということでしょう。 問題は、shはCommand not foundなどの理由で失敗した時に 1を返しますが、他の大部分のbuilt-inコマンドも失敗した時には 1を返す、ということです。このため、shで失敗したのか、 shから呼ばれたコマンドで失敗したのかは区別がつきません。 shもその他のコマンドも成功したら0を返すので、 「0 が成功でそれ以外は失敗として扱う」というのが 正解だと私も思います。

noname#794
質問者

お礼

回答ありがとうございました。

その他の回答 (1)

  • aton
  • ベストアンサー率47% (160/334)
回答No.1

 私も調べてみましたが,いまいちはっきりわからなかったので,以下想像です。  manの記述は,fork()またはexec()で失敗したときのみ-1を返すというようにも読めるので,この場合はshの終了ステータスが返ってきてるのではないでしょうか? shのmanページでは,0以外は何らかのエラーということのようです。  あるいはsystem()と同じライブラリー(stdlib.h)に定義されている EXIT_FAILURE が返ってきているのかもしれません。ちなみにこの場合もうまくいったことを表すと思われる EXIT_SUCCESS の値は0です。  というわけで,あまりお役に立ちそうもない情報ですが,いずれにせよ 0 が成功でそれ以外は失敗として扱うことにしてみてはいかがでしょうか。

noname#794
質問者

お礼

回答ありがとうございました。

関連するQ&A