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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qunixでコマンドを実行したい。

シミュレーションの結果を取りたいのですが
膨大な量のシミュレーションを手で打つわけにはいかずに困っています。

/home/simu/simu.exe

例えば上にあるsimu.exeを120秒ごとに100回実行したい時にはどういったプログラムをつくればよいのでしょうか?

Aベストアンサー

シェルのプロンプトから以下のように打てばいいです。

for i in `seq 100`
do /home/simu/simu.exe
sleep 120
done

または、上記の内容を、simu100 というファイルに入れて、sh simu100 とやってもいいです。

1行目の ` はshift+@です。shift+7と間違えないように。

QATコマンドがSYSTEM権限で実行される為、メールスロットへ書き込めない

現在、windows-2003サーバーでVC.NETで開発しています。プロセスAはメールスロットを読み込み用にオープンし、これに、プロセスBがデータ(コマンド)を書き込みます。
両プロセスともに、Administratorで実行時は、問題ないのですが、プロセスAをatコマンドを使用して、起動すると、このプロセスはSYSTEM権限で実行されてしまいます。その為、このプロセスにコマンドを発行しようとして、プロセスBが(administrator権限)メールスロットを書き込み用にオープンすると、access deniedでエラーとなってしまいます。プロセスAは、毎日定時に起動する為、atコマンドを使用する必要があります。
プロセスBは、コマンドとして使用する為、atコマンドによる起動はできません。この前提で、メールスロットへエラーにならずに書き込むことができるでしょうか。

Aベストアンサー

atコマンドでタスクを登録するのではなく、GUI(「アクセサリ」->「システムツール」->「タスク」)から登録するのはダメなのですか?

Qsystem関数を使用してsuコマンドを実行したいのですが

Linux RedHat7.2の環境にて、system関数を使用してsuコマンドを実行し、ルートになりたいのですが(さらにその後rebootしたい)、以下の結果のようになってしまいルートになれません。system()の使用方法がまずいのでしょうか。
どなたか助けてください。お願いします。

--------------------------ソースコード--------------------------------
#include <stdio.h>
#include <stdlib.h>

int main( int argc, char **argv)
{
int i;

i = system("su - password");

i = system("reboot");

return 0;
}
--------------------------ソースコード--------------------------------

--------------------------結果--------------------------------
[nmpb@nmpb_linux02 BIN]$ ./aaa.out
su: user password does not exist
--------------------------結果--------------------------------

Linux RedHat7.2の環境にて、system関数を使用してsuコマンドを実行し、ルートになりたいのですが(さらにその後rebootしたい)、以下の結果のようになってしまいルートになれません。system()の使用方法がまずいのでしょうか。
どなたか助けてください。お願いします。

--------------------------ソースコード--------------------------------
#include <stdio.h>
#include <stdlib.h>

int main( int argc, char **argv)
{
int i;

i = system("su - password");

i = system("rebo...続きを読む

Aベストアンサー

system()はシェルを起動するだけです。2度関数を呼んでもシェルが2度起動されるだけで、
相互の関連はありません。恐らく、意図されていることを行うには、

1.system("reboot"); を含むソースをコンパイルする。
2.できたプログラムのオーナーをrootにする。
3.chmod u+s プログラム で、オーナー権限で動作するようにする。

というのが妥当ではないかと思います。

Qコマンドを実行してコマンドライン文字列を読み込む

C言語(他の言語でも)で、コマンドを実行して結果の文字列を取得できるような関数はないでしょうか?

コマンドを実行したプログラム内の変数に文字列として保持して、処理したいと考えています。

Windowsです。

よろしくお願い致します。

Aベストアンサー

外部コマンド実行のしっかりしたサポートがある言語を選ぶのがいいと思いますが、Cプログラム中から外部コマンドを呼び出したいというなら。。。
できるだけ、C言語から逸脱せずにやろうとすると、コマンド実行は system() 関数で実行できて、かつ、"> filename" をつけてコマンド結果をファイルにリダイレクトできることを仮定すれば、以下のような感じになりますかね。


あと、エラー処理などいっさいしていないことや、文字数の数え方を端折っていますので、適当に修正してください。
コマンド実行結果の格納に何文字いるかは、きっちりやろうと思えば、一度、fseek() などしないで、
・ファイルを実際読み込んでカウントし、rewind() するか、
・ファイルを読み込みながら、文字を格納している領域を拡張する
ということをします。ここでは、ファイルサイズよりは大きくならないだろう(たとえば、改行文字の変更などにより小さくはなっても大きくならない)と仮定してファイル位置から文字数を推定しています。

=====
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *execute(const char *cmd)
{
static char *cmdbuf = NULL;
static size_t bufsiz = 0;
static char fn[L_tmpnam];
const char *redirect = " > ";
size_t siz;

tmpnam(fn);
if ((siz = strlen(cmd) + strlen(redirect) + strlen(fn) + 1) > bufsiz)
cmdbuf = realloc(cmdbuf, bufsiz = siz);
strcpy(cmdbuf, cmd);
strcat(cmdbuf, redirect);
strcat(cmdbuf, fn);
system(cmdbuf);
return fn;
}

char *result(const char *fn)
{
long fsiz;
char *rv, *p, c;
FILE *fp = fopen(fn, "r");

fseek(fp, 0, SEEK_END);
fsiz = ftell(fp);
rv = p = malloc(fsiz + 1);
rewind(fp);
while ((c = getc(fp)) != EOF) *p++ = c;
*p = '\0';
fclose(fp);
remove(fn);

return rv;
}

int main(int argc, char *argv[])
{
int i;
for (i = 1; i < argc; ++i) {
char *str = result(execute(argv[i]));
printf("%s\n", str);
free(str);
}
}
===
Usage: program command1 command2 ...

外部コマンド実行のしっかりしたサポートがある言語を選ぶのがいいと思いますが、Cプログラム中から外部コマンドを呼び出したいというなら。。。
できるだけ、C言語から逸脱せずにやろうとすると、コマンド実行は system() 関数で実行できて、かつ、"> filename" をつけてコマンド結果をファイルにリダイレクトできることを仮定すれば、以下のような感じになりますかね。


あと、エラー処理などいっさいしていないことや、文字数の数え方を端折っていますので、適当に修正してください。
コマンド実行結果...続きを読む

Qコマンドライン実行とPHPのEXEC実行

C言語プログラムの不具合に悩んでいます。

◇以下抜粋ソース
static int a=0;
・・・
int 関数A(){ /*別ファイルで使用*/
・・・
  a=256;
・・・
}
int 関数B(){
int i;
・・・
for(i=0;i<a;i++){
if(for文を抜ける条件){break;}
}
if(i==a){ printf(エラー!);}
・・・
}
◇以上抜粋ソース

上記のソースより常にi=a=0になってしまうので常にエラーとなる気がするのですがいまいち確信が持てません。
というのも、このソースは他の人から頂いたもので、コマンドラインから実行すると何故か100パーセント正常動作するのです。
しかしブラウザを起動して、PHPファイルにアクセスし、PHPのEXEC関数から実行すると3回に1回ほどの割合で(エラー!)がでます。
3回に2回は正常動作します。

似たような不具合を御経験の方がおられれば何卒御教示ください。
よろしくお願いします。

C言語プログラムの不具合に悩んでいます。

◇以下抜粋ソース
static int a=0;
・・・
int 関数A(){ /*別ファイルで使用*/
・・・
  a=256;
・・・
}
int 関数B(){
int i;
・・・
for(i=0;i<a;i++){
if(for文を抜ける条件){break;}
}
if(i==a){ printf(エラー!);}
・・・
}
◇以上抜粋ソース

上記のソースより常にi=a=0になってしまうので常にエラーとなる気がするのですがいまいち確信が持てません。
というのも、このソースは他の人から頂いたもので、コマンドライ...続きを読む

Aベストアンサー

ご提示のソースからでしたら
関数Aの a=256;が実行される前でしたら aの内容は0でしょう
関数Aが呼ばれる前に関数Bが呼ばれれば i==aが成立します

エラーになる原因の特定が必要でしょうね
この実行ファイルが コマンドライン引数や何処かのファイルデータなど外部要因によって動いているのであればそれらが PHPで実行した場合とコマンドプロンプトから実行した場合で同じなのかどうかとか
期待している実行順序で実行されているのか
といったことを 一つ一つ潰していくしかないと思います

ログを吐くようにプログラミングして どこまで期待通りなのか
エラーになる際はどこで 意図しない動作なのかを見比べて見ましょう


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

人気Q&Aランキング

おすすめ情報