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は実行されないのでしょうか。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
C++は少しかじったくらいなのではっきり言えませんが、なぜエラーになるのかの判断として、errnoを見てみるのはどうですか?
通常ですとerrno.hをインクルードして変数errnoを見ればエラーの種類がわかります。例えば、メモリが足りないとか・・・ただし、errnoはintの整数ですが、ヘッダの中を見ればエラーの種類はわかりますよ。
ありがとうございます。
errnoは使っていました。
が、manで調べていたので、エラーの種類がわからなかったんです。
ヘッダの中を見て、ようやく分かりました。ありがとうございました。
No.1
- 回答日時:
このような質問をされる際の一般原則ですが、お使いの環境(OSの種類など)について
書いておいて頂いた方が、的確な回答を得やすいと思います。
プログラムを拝見しましたが、この範囲では、特に問題のありそうな個所は見当たらない
ように思います。恐らく、fork()が失敗したわけでもexecl()が失敗したわけでもない
...となると、残るはcomの内部ですね。(ch_pid =0;execl(shell)が表示されないのは、
恐らくバッファリングされて、出力されていないためでしょう。)
試みに、ハングアップした状態で、psコマンドで状況を確認してみて下さい。
・子プロセス(csh)が動いていなければ、上のプログラムに問題があります。
・子プロセスが起動されながら動いていなければ、comが何かのリソース待ちです。
・子プロセスが動きつづけていれば、恐らくcomが何かのバグで、無限ループに陥っています。
回答ありがとうございました。
ここでは記載していなかったのですが、
この関数がスレッドだったためfork()ではなく、fork1()を使うほうが良かったようです。
また、fork()とexecl()の間にログを吐くマクロ(自作)を入れていたのですが、それが大きな原因だったようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
これってパソコンの最適化が完...
-
バッチファイルの内容を表示さ...
-
pythonスクリプトを管理者権限...
-
Excel VBA ステップインが途中...
-
[teraterm] waitコマンドで停止...
-
「読み取りと実行」と「読み取...
-
exeファイルを実行するとコマン...
-
16進数の変換処理
-
バッチファイルが不正終了して...
-
【VB.NET】exeを実行すると「発...
-
ExcelのVBAが特定のPC上でのみ...
-
VBscriptが起動しない?
-
VBSでExcel上の数字に連番をふ...
-
Windowsアプリケーションをメモ...
-
実行中のログをフォームのテキ...
-
Excel(エクセル) VBA プロシー...
-
ttlマクロによるディレクトリ配...
-
エクセル フォルダの画像を画...
-
.NETからストアドプロシージャ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
exeファイルを実行するとコマン...
-
[teraterm] waitコマンドで停止...
-
「読み取りと実行」と「読み取...
-
これってパソコンの最適化が完...
-
VBscriptが起動しない?
-
ネットワーク名が見つかりません
-
hostファイル
-
バッチファイルの内容を表示さ...
-
エクセル フォルダの画像を画...
-
PDFファイルを開き、印刷し、閉...
-
バッチファイルで以下のような...
-
Excel(エクセル) VBA プロシー...
-
VScodeのエラー解決法 Pythonの...
-
NASに移したBATファイルからセ...
-
pythonスクリプトを管理者権限...
-
Excel VBA ステップインが途中...
-
バッチファイルが不正終了して...
-
16進数の変換処理
-
複数のbatファイルを自動実行し...
おすすめ情報