プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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 が成功でそれ以外は失敗として扱う」というのが
正解だと私も思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/08/24 18:35

 私も調べてみましたが,いまいちはっきりわからなかったので,以下想像です。


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

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

お礼日時:2001/08/24 18:36

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

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


このQ&Aを見た人がよく見るQ&A