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

execl+forkで起動したシェルの結果

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

execl+forkでシェルを起動したとき、
起動したシェルから返ってくる結果はどうやってとれるのでしょうか。

==============
pid_t pid_c;

if(pid_c == 0)
{
int ret = execl(shell,shell, id, NULL);
if(ret != 0)
{
exit(1);
}
}
else if (pid_c < 0)
{
exit(1);
}
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル8

ベストアンサー率 75% (12/16)

質問に答え損ねてましたね。&はANDをとる演算子です。
ちょっと気になるのは、子プロのexit値が1とか2のとき
100とか200になるってことですが、使ってるマシンはなん
ですか?Pentium系でしょうか?Pentium系の場合、バイト
エンディアンはリトルエンディアンなので、このビット演算
のところが違うかもしれません。

エンディアンについて(ご存じかもしれませんが...)
intが4バイト整数の処理系の場合、
 SPARCやRISC等のビッグエンディアンの場合、ビット並びは
 +-+-+-+-+
 |1|2|3|4| ですが、
 +-+-+-+-+
 Pentiumなどの場合、
 +-+-+-+-+
 |4|3|2|1| となっています。
 +-+-+-+-+
 
私の書いたビット演算とシフトは、リトルエンディアンの場合、
違ってくる(かも)しれません。

いずれにしろ、statusの4バイトのうち、どこか1バイトにexit値が
隠れているはずですから、参考になる資料が手元になければ、試しに
いろいろやってみるうちに見つかるでしょう。
#なんていい加減な回答なんでしょう(^^; 他の詳しい専門家が見たら
#怒られるでしょうね...。
お礼コメント
noname#794

ありがとうございます。
さらに調べたところ、WEXITSTATUS(status)というマクロもあるみたいです。
投稿日時 - 2001-07-27 19:35:38
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル8

ベストアンサー率 75% (12/16)

こんにちは。ずいぶん昔にUNIXでマルチプロセスのプログラム書いた経験の あるものです。 もう当時のプログラムもCリファレンスも手許にないので...、うろ覚えで かつ、断片的な情報ですが、こんなのでも調べる何かのヒントになればと思い、 書きます。 親側で、wait()を使って子プロを待ち、調べたのではないかと思います。 確かこんな感じ... int status; wait(& ...続きを読む
こんにちは。ずいぶん昔にUNIXでマルチプロセスのプログラム書いた経験の
あるものです。
もう当時のプログラムもCリファレンスも手許にないので...、うろ覚えで
かつ、断片的な情報ですが、こんなのでも調べる何かのヒントになればと思い、
書きます。

親側で、wait()を使って子プロを待ち、調べたのではないかと思います。
確かこんな感じ...
int status;
wait(&status);
呼び出したプログラムのstatus値(exitの値)は、
stat = (status & 0x0000ff00) >> 8;
みたいな感じで計算すれば、取得できたのでは...。
詳しくは、UNIXのシステムコールリファレンスなんかを読めば載っていると
思います。

間違えてる可能性もあるので、よく確かめてくださいね。やってみて、あってたら
ラッキーってくらいに考えてください。
不確かな情報で申し訳ないです。
補足コメント
noname#794

うまくいきました。ありがとうございます。
ところで、
stat = (status & 0x0000ff00) >> 8;
って具体的に何をしてるんでしょうか。
&ってANDをとってるんでしたっけ?
戻り値が1のときstatus=100
2のときstatus=200って感じになってるのはわかったんですけど。
投稿日時 - 2001-07-19 17:08:58


  • 回答No.2
レベル8

ベストアンサー率 75% (12/16)

mar328です。うまくいって何よりです。 statusの計算処理ですが、あれはビット演算を施して、int値のstatus (うちの処理系では32bit)から子プロの返すステータス値を取り出している のです。(マシンはSun Sparcで、これはビッグエンディアンマシンです。) wait(&status)で帰ってくるstatusには、いろいろな情報が入っていて、 それらはビット単 ...続きを読む
mar328です。うまくいって何よりです。

statusの計算処理ですが、あれはビット演算を施して、int値のstatus
(うちの処理系では32bit)から子プロの返すステータス値を取り出している
のです。(マシンはSun Sparcで、これはビッグエンディアンマシンです。)

wait(&status)で帰ってくるstatusには、いろいろな情報が入っていて、
それらはビット単位で格納されています。
(0~NビットまではXX、N+1~Mまでは○○、っていうかんじで)
細かい内容は忘れてしまい、資料も手許にないので、詳しいことが説明できない
のですが、そういうことです。
(※ソースから見ると、上位から3バイト目の8ビットに格納されている値を取り
出すために0x0000ff00とマスクをかけて、それをintに格納するために8ビット
分、右へシフトしているってところでしょうか)

昔私が使っていた本で、「UNIXシステムプログラミング」という本があって、
それにはわりとわかりやすく解説がありました。
(たぶん、羽山博著、オーム社だったと...)
まぁ、同じような本には載っているとは思いますが...。

こんな感じで、後は調べて見てください。

ただ、子プロセスを扱うプログラムは、親子で同期をとったり、また親子が同時に
動作しないといけないとか、いろいろ条件が複雑ですので、実際にシビアな使い方
をする場合は、よく仕様等を確認、テストしてくださいね。私も自信があまりない
ので、もし不具合等のトラブルがあっても、困りますので。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

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

特集


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

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ