• ベストアンサー

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

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); }

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

  • ベストアンサー
  • mar328
  • ベストアンサー率75% (12/16)
回答No.3

質問に答え損ねてましたね。&は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)というマクロもあるみたいです。

その他の回答 (2)

  • mar328
  • ベストアンサー率75% (12/16)
回答No.2

mar328です。うまくいって何よりです。 statusの計算処理ですが、あれはビット演算を施して、int値のstatus (うちの処理系では32bit)から子プロの返すステータス値を取り出している のです。(マシンはSun Sparcで、これはビッグエンディアンマシンです。) wait(&status)で帰ってくるstatusには、いろいろな情報が入っていて、 それらはビット単位で格納されています。 (0~NビットまではXX、N+1~Mまでは○○、っていうかんじで) 細かい内容は忘れてしまい、資料も手許にないので、詳しいことが説明できない のですが、そういうことです。 (※ソースから見ると、上位から3バイト目の8ビットに格納されている値を取り 出すために0x0000ff00とマスクをかけて、それをintに格納するために8ビット 分、右へシフトしているってところでしょうか) 昔私が使っていた本で、「UNIXシステムプログラミング」という本があって、 それにはわりとわかりやすく解説がありました。 (たぶん、羽山博著、オーム社だったと...) まぁ、同じような本には載っているとは思いますが...。 こんな感じで、後は調べて見てください。 ただ、子プロセスを扱うプログラムは、親子で同期をとったり、また親子が同時に 動作しないといけないとか、いろいろ条件が複雑ですので、実際にシビアな使い方 をする場合は、よく仕様等を確認、テストしてくださいね。私も自信があまりない ので、もし不具合等のトラブルがあっても、困りますので。

  • mar328
  • ベストアンサー率75% (12/16)
回答No.1

こんにちは。ずいぶん昔に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って感じになってるのはわかったんですけど。

関連するQ&A