• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:シェルでのリダイレクションとdupとclose)

シェルでのリダイレクションとdupとclose

このQ&Aのポイント
  • シェルでのリダイレクションとdupとcloseについて説明します。
  • リダイレクションを行った後、コマンドを受け付けなくなる問題について解決方法を探しています。
  • close()の適切な位置についてアドバイスをお願いします。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

これは fork とファイルディスクリプタの関係を考えればほぼ自明です. fork によって新たに子プロセスが作られるわけですが, この子プロセスはファイルディスクリプタを親プロセスと共有します. そして, dup2 はファイルディスクリプタを別のファイルディスクリプタにコピーするという動作をします. ですから, fork の前に dup2 を発行すると, fork が新たに生成した子プロセスだけでなく, 親プロセスも dup2 の影響を受けます. そして, 今のプログラムでは fork のあとで親プログラムが dup2 の効果を打ち消していません. その結果として, 「一度あるファイルにリダイレクトすると (次に別のファイルにリダイレクトするまで) 全てのコマンドがリダイレクトされる」ということになるはずです. だから「本当に『コマンドを受け付けない』状態なんですか? 単に出力がどこかに行っているだけじゃなく?」と書いたんだけどねぇ.... これに対し, fork のあと (子プロセスで) dup2 を発行すると, 当然ですが dup2 の効果は子プロセスにしか働きません. つまり, 新たに生まれた子プロセス (とそこから生成される子プロセス) ではリダイレクトが効きますが, 親プロセスは (dup2 の影響を受けないので) リダイレクトされていないということになります. これが「普通期待する動作」ですよね? もちろん「fork の前に dup2 を発行し, fork したあとで親プロセスが再度 dup2 を発行して元の状態に戻す」ということをやってもいいんだけど, そんな手間をかけるくらいなら「fork してできた子プロセスで dup2 を発行」した方がよほど楽.

BASSMANIA
質問者

お礼

なるほど。 分かりやすい回答ありがとうございます! 勉強になりました!がんばって勉強してプログラム完成させます!

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

本当に「コマンドを受け付けない」状態なんですか? 単に出力がどこかに行っているだけじゃなく? それにしても, fork してからリダイレクト処理しない理由ってなんだろ....

BASSMANIA
質問者

お礼

ありがとうございます!!! forkしてからリダイレクションしたら問題が解決しました!! ちなみに、質問で書いたプログラムとforkしてからリダイレクションするのと、動作が全く違うのはなぜですか?

すると、全ての回答が全文表示されます。

関連するQ&A