OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

forkの失敗???

  • すぐに回答を!
  • 質問No.143996
  • 閲覧数1047
  • ありがとう数4
  • 気になる数0
  • 回答数3
  • コメント数0

C++(UNIX)です。
以下のようなprogramをくみました。
comは自作のCシェルです。

-------------------
:
pid_t ch_pid = fork();
cout << "ch_pid = " << ch_pid<< endl;

int shell_ret = 0;
int execl_ret = 0;
int status = 0;
if( ch_pid == 0)
{
cout << "execl(shell)" << endl;
execl_ret = execl(com, com, NULL);
cout << "execl ret = " << execl_ret << endl;
}
else if(ch_pid < 0)
{
cout << "fail to fork" << endl;
cout << "errno = " << errno << endl;
return 0;
}
waitpid(ch_pid, &shell_ret, 0);
:
------------------


実行したところ、
成功する[シェルが実行される]場合と、失敗する[シェルが実行されない]場合があります。
シェルが失敗するときはそれ以上先に進まず、固まってしまいます。(waitpidのせいだと思いますが。)

成功する場合のログ
---------------

ch_pid = 12885
ch_pid = 0
execl(shell)


---------------

失敗する場合のログ
---------------

ch_pid = 12885


---------------

forkに失敗していたら、"fail to fork"と表示されると思うので
forkには失敗していないと思うのですが・・・。
なぜ、execlは実行されないのでしょうか。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全3件)

  • 回答No.1
レベル13

ベストアンサー率 24% (357/1463)

このような質問をされる際の一般原則ですが、お使いの環境(OSの種類など)について 書いておいて頂いた方が、的確な回答を得やすいと思います。 プログラムを拝見しましたが、この範囲では、特に問題のありそうな個所は見当たらない ように思います。恐らく、fork()が失敗したわけでもexecl()が失敗したわけでもない ...となると、残るはcomの内部ですね。(ch_pid =0;execl(she ...続きを読む
このような質問をされる際の一般原則ですが、お使いの環境(OSの種類など)について
書いておいて頂いた方が、的確な回答を得やすいと思います。

プログラムを拝見しましたが、この範囲では、特に問題のありそうな個所は見当たらない
ように思います。恐らく、fork()が失敗したわけでもexecl()が失敗したわけでもない
...となると、残るはcomの内部ですね。(ch_pid =0;execl(shell)が表示されないのは、
恐らくバッファリングされて、出力されていないためでしょう。)
試みに、ハングアップした状態で、psコマンドで状況を確認してみて下さい。
・子プロセス(csh)が動いていなければ、上のプログラムに問題があります。
・子プロセスが起動されながら動いていなければ、comが何かのリソース待ちです。
・子プロセスが動きつづけていれば、恐らくcomが何かのバグで、無限ループに陥っています。
お礼コメント
noname#1080

回答ありがとうございました。
ここでは記載していなかったのですが、
この関数がスレッドだったためfork()ではなく、fork1()を使うほうが良かったようです。
また、fork()とexecl()の間にログを吐くマクロ(自作)を入れていたのですが、それが大きな原因だったようです。
投稿日時 - 2001-10-03 09:07:33


  • 回答No.2
レベル7

ベストアンサー率 44% (11/25)

C++は少しかじったくらいなのではっきり言えませんが、なぜエラーになるのかの判断として、errnoを見てみるのはどうですか? 通常ですとerrno.hをインクルードして変数errnoを見ればエラーの種類がわかります。例えば、メモリが足りないとか・・・ただし、errnoはintの整数ですが、ヘッダの中を見ればエラーの種類はわかりますよ。 ...続きを読む
C++は少しかじったくらいなのではっきり言えませんが、なぜエラーになるのかの判断として、errnoを見てみるのはどうですか?
通常ですとerrno.hをインクルードして変数errnoを見ればエラーの種類がわかります。例えば、メモリが足りないとか・・・ただし、errnoはintの整数ですが、ヘッダの中を見ればエラーの種類はわかりますよ。
お礼コメント
noname#1080

ありがとうございます。
errnoは使っていました。
が、manで調べていたので、エラーの種類がわからなかったんです。
ヘッダの中を見て、ようやく分かりました。ありがとうございました。
投稿日時 - 2001-10-03 09:09:25
  • 回答No.3
レベル13

ベストアンサー率 34% (574/1662)

このソースだとexecl()が失敗した場合, waitpid()を実行してしまい、ハングするでしょうね。 return errnoあたりが適切でしょうか。 あとは、情報不足なのでわかりません。 fork()やexecl()の失敗時のerrnoは必ずわかるようにしておきましょう。 -1がわかってもうれしくないです(^^; execl()が失敗する可能性も無いとは言えないかなぁ。 ...続きを読む
このソースだとexecl()が失敗した場合, waitpid()を実行してしまい、ハングするでしょうね。
return errnoあたりが適切でしょうか。
あとは、情報不足なのでわかりません。
fork()やexecl()の失敗時のerrnoは必ずわかるようにしておきましょう。
-1がわかってもうれしくないです(^^;

execl()が失敗する可能性も無いとは言えないかなぁ。
お礼コメント
noname#1080

回答ありがとうございます。
execl()の失敗等のエラー処理も追加しました。
投稿日時 - 2001-10-03 09:10:55
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ