• ベストアンサー

リダイレクトでのdup関数の必要性って?

Win2k+cygwinで学習してます。 参考書に /* test.c */ #include<stdio.h> int main(void){ printf("HelloWorld"); return 0; } $ ./test.exe > file というリダイレクトについての説明で 標準出力のリダイレクトの振舞いについて、 close(1); dup(fd); //既生成のディスクリプタを空いている1番に複製? close(fd); write(1,…); という処理が行われているとありました(コメント文は私の考え)。 複製の意味がイマイチわかりません。もし、fdディスクリプタの評価値が3の時にはdup(fd);で fdの評価値は1に変更されてしまうという事ですか? でもclose(fd);としたら1番ディスクリプタが開放されてしまい、元に戻ってしまいますよね? 上記リストの動作は close(1); FILE *fp=fopne("pathname","w"); //1番ディスクリプタが空きなのでカーネルによって1番がfp->fileに割当てられる write(fp->file,…); する事と同じと解釈していいんですかね(fp->fileはディスクリプタを表す)。 つまり、dup関数はディスクリプタの複製を作るではなく、生成させる関数と呼ぶべきじゃないのかなと思ったのですが、、、 うーん、ディスクリプタのコピーってどういう意味なんですか??

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

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

既に回答にある通りですが、少し補足します。 >する事と同じと解釈していいんですかね この場合pathnameが判っていれば操作できるファイルとディクリプタの数値は同じものになりますが、 ディクリプタのみが渡される場合は同じことはできません。 具体的には例えば子プロセスが生成された場合の標準入出力がそれです。 また、たとえばファイルを途中まで読んでいた場合は、dupでは読出し位置は変化しませんが、close,openした場合は当然ファイルの先頭になりますから、そういう意味では結果は異なります。(他にも違いがあります) つまり、同じではないということです。 openでは複製を作ることはできません。全て引き継ぐにはdupが必要です。 また、実際の使用例としてはpipe(2)を使って標準入出力をつなげる場合を考えてみてください。(shellの実装) おそらく、dupを使わないと実現できないと思います。

hhozumi
質問者

補足

ご回答まことにありがとうございます。 > ディクリプタのみが渡される場合は同じことはできません。 > 具体的には例えば子プロセスが生成された場合の > 標準入出力がそれです。 > また、たとえばファイルを途中まで読んでいた場合は、 > dupでは読出し位置は変化し > ませんが、close,openした場合は当然ファイルの > 先頭になりますから、そういう意味 > では結果は異なります。(他にも違いがあります) > つまり、同じではないということです。 これは興味お話です。 この2件の具体的リストはどのようになりますでしょうか? (簡単なリストで構いませんので)

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

dupの動作は、実行した時点で最小のディスクリプタにファイルを割り当てるということで、 質問文の場合、 dupを実行した時点で 《1とfdの両方でファイルを扱えます。》 (fdが1に変更されるのではないです、dupはduplicateの略で複製するという意味だと思われます) close(fd)は、 fdが3だとしたらあくまで3の方を閉じるという意味で、1を閉じるのではありません。 >ディスクリプタのコピーってどういう意味なんですか? 同じファイルを別のディスクリプタで操作できるという意味です。

hhozumi
質問者

補足

ご回答大変ありがとうございます。 > dupの動作は、実行した時点で最小のディスクリプタにファイルを割り当てるという > ことで、 > 質問文の場合、 > dupを実行した時点で > 《1とfdの両方でファイルを扱えます。》 > (fdが1に変更されるのではないです、dupはduplicateの略で複製するという意味 > だと思われます) > close(fd)は、 > fdが3だとしたらあくまで3の方を閉じるという意味で、1を閉じるのではありま > せん。 この動作を顕著に見て取れるリストをご紹介いただけませんでしょうか? >> ディスクリプタのコピーってどういう意味なんですか? > 同じファイルを別のディスクリプタで操作できるという意味です。 うーん、これもいまいちピンと来ません。

関連するQ&A