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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
これってパソコンの最適化が完...
-
[teraterm] waitコマンドで停止...
-
exeファイルを実行するとコマン...
-
ネットワーク名が見つかりません
-
エクセル フォルダの画像を画...
-
「読み取りと実行」と「読み取...
-
cpadでプログラムが実行できない
-
pythonスクリプトを管理者権限...
-
バッチファイルが不正終了して...
-
VBscriptが起動しない?
-
PDFファイルを開き、印刷し、閉...
-
ttlマクロによるディレクトリ配...
-
Excel(エクセル) VBA プロシー...
-
Windows10でWord2010だけエラー...
-
VBAでバッチファイルを1つ実行...
-
16進数の変換処理
-
EXIF情報を出力するマクロ
-
asp.netからbcpコマンドの実行
-
Autorun.inf 無確認でプログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
VBscriptが起動しない?
-
exeファイルを実行するとコマン...
-
これってパソコンの最適化が完...
-
[teraterm] waitコマンドで停止...
-
「読み取りと実行」と「読み取...
-
バッチファイルの内容を表示さ...
-
【VB.NET】exeを実行すると「発...
-
PDFファイルを開き、印刷し、閉...
-
VScodeのエラー解決法 Pythonの...
-
Excel(エクセル) VBA プロシー...
-
ネットワーク名が見つかりません
-
バッチファイルが不正終了して...
-
エクセル フォルダの画像を画...
-
NASに移したBATファイルからセ...
-
VBScriptでコマンドプロンプト...
-
pythonスクリプトを管理者権限...
-
Excel VBA ステップインが途中...
-
複数のbatファイルを自動実行し...
-
16進数の変換処理
おすすめ情報