• ベストアンサー

ファイルディスクリプタ

unix系環境+Cではファイルディスクリプタを使用しようとすることが多いそうですが、その利点は何でしょうか? さまざまな制御系を一意的に表現できるというのは便利だと思うのですが、ファイルを読み込むだけならポインタで操作した方が早いのではないかと思うのですが。   

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

  • ベストアンサー
回答No.2

もしファイルディスクリプターを使っているとしたら、利点があるからと言うよりも必然性があるからだと思います。fopen / fread / fwrite / fgets / fcloseなどの関数で十分なれべるのプログラムにわざわざopen / read / write / closeといったシステムコールを使ってそれらがやっているようなバッファリングなどの処理を自分でやる必要はありません。例えば、次のような場合でしょう。 1. システムコールを直接呼びたい 2. 準備ができた時だけ可能な量を読み書きしたい 3. FILE構造体による余計なメモリーを消費したくない ちなみに、fopen、fread、fgetsなどは、内部でopen、readなどのシステムコールからファイルディスクリプターを使うアクセスとなっています。 例えば、Unix系OSでファイルを開くのはopenシステムコールで行い、openシステムコールはファイルディスクリプターという識別のための値を返します。FILEポインターで操作する場合はfopen関数を呼びますが、その裏ではopenシステムコールを読んでいます。 http://svnweb.freebsd.org/base/head/lib/libc/stdio/fopen.c?revision=249810&view=markup この_openというのがシステムコールです。 つまり、FILEポインター使ったファイルの読み書きは結局はファイルディスクリプターを使った読み書きに裏で翻訳されます。一方でFILEポインターは様々なプラットホームで動くような標準的な機能しか持っていないのでUnix系OSにしかないファイル操作のためのシステムコールはこれ経由だと使えません。 1. システムコールを直接呼びたい OSとの間でファイルを識別するための番号はファイルディスクリプターですので、ファイルについてのシステムコールを呼び出すにはファイルディスクリプターを使う必要があります。 よく使うシステムコールには例えば、mmapというファイルの内容を直接メモリーに割り付けるシステムコール、、ファイルを他のプログラムから操作できないようにロックをするflockなどがあります。 2. 準備ができた時だけ可能な量を読み書きしたい 読める状態でないのに読んだり、書き込みのためのバッファがあふれたのに書き込んだりすると、準備ができるまでそこで待ちます。これをブロックと言います。複数のファイルの読み書きをする場合、ブロックして待たされるよりも今読み書きできるファイルを処理をしたほうが効率的ですので、Unixにはselect、pollというシステムコールが用意されています。そして、これらのシステムコールには準備ができたら教えてほしいというファイルディスクリプターの一覧表を渡します。 3. FILE構造体による余計なメモリーを消費したくない システムコールを直接使いたいという用途だけが理由なら、filenoという関数でFILEポインターからファイルディスクリプターをとりだすという方法が用意されています。ただ、ファイルを開くときに既にmmapを使うなどがわかっているとわざわざfopenで開いてFILE構造体を覚えておくだけのメモリーを無駄遣いするよりは直接openでファイルディスクリプターを取り出したほうが効率的ですよね。 というわけで、利点があるからというよりもそれしかできないことをしたいからとか無駄だからとかいう理由でファイルディスクリプターを直接操作すると思います。あとはsocketやpipeなどプロセス間通信もファイルディスクリプターへの読み書きで行うのでソッチのほうでまとめたほうが何かと操作しやすいというのもあるかもしれません。

pipopipoid
質問者

お礼

なんとかプログラムを読める程度なので、ほんの筆者さんがなぜファイルディスクリプタをつかっているのかまでよみとけていませんが、おそらくシステムコールをせつめいしたかったのだと解釈しました。 fgetsなどがより深いレベルで関与されているとはしりませんでした。 おそらくまだ無理ではあるでしょうが頑張ってソースを読んでみます

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.3

>コマンドの説明箇所で/var/adm/utmpを操作する際にファイルディスクリプトを用いているのがひっかかりました。/var/adm/utmpをファイルであると考えているのですがプロセスだったりするのでしょうか? ファイルです。 例えそれが、とあるプロセスが生成している仮想ファイルであってもファイルには違いありません。 また/var/adm/utmpは、unix系ならどれでもあるというわけではありません。 >また、ポインタでも同じ動作をできるのですか? #1にも書きましたけど、あなたのいうポインタとは何の事ですか?

pipopipoid
質問者

お礼

FILE構造体です。 やはり仮想的なファイルではあるんですね。 本で説明されているプログラムが少し変な動作になっているのもlinuxだからかもしれません。 ありがとうございました。

  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.1

ポインタで操作するというのが何の事かわかりませんが(fopenをはじめとするFILE *を扱う関数のこと?)、ファイルを読み込むだけの処理でファイルディスクリプタを直接使用する方が稀だと思いますけど。

pipopipoid
質問者

お礼

ありがとうございます。 現在unixプログラミングという本を学習中なのですが、 Who コマンドの説明箇所で/var/adm/utmpを操作する際にファイルディスクリプトを用いているのがひっかかりました。/var/adm/utmpをファイルであると考えているのですがプロセスだったりするのでしょうか? また、ポインタでも同じ動作をできるのですか?

関連するQ&A

  • Windows inodeに変わるファイル及びディレクトリの一意な情報

    Windows環境でinodeに変わるファイル及びディレクトリの一意な情報 はないでしょうか? タイムスタンプの更新、ファイルサイズの変更、ファイル名の変更 などの情報更新後も、UNIXであればinodeが変わらないので、そのファイルが一意である事を認識できるのですが、windows環境ではinodeの概念が無いので、このような事ができません。 windows環境で、このような情報変更後も、一意な情報って無いのでしょうか?

  • テキストファイルの一行目に特定の文字を追加するソフトを探しています

    テキストファイルの一行目に特定の文字を追加するソフトを探しています。さらに、ファイルの先頭から何行かを削除する操作もできると助かります。 私はCとフォートランを使うので、 UNIX上でそうゆう操作をするようなプログラムを作るのは可能なのですが・・・ ウィウンドウズ上で、条件を指定しておけば、 あとはドラッグ&ドロップでそうゆうことをやってもらえるソフトがあれば便利なのに!・・と思います。 UNIX上では、読む込むファイルをいちいち指定するのが面倒で・・。

  • わざわざUnix等を使用する利点とは??

    近年、企業等のシステム開発でOSとしてUNIXやLinuxを使用する所が増えてきているそうですが、その利点とはどんなことがあるのでしょうか? Windowsと違って無料ということはわかりますが、それ以外に利点はあるのでしょうか? (個人的にはなぜ扱い易いWindowsを使わないのか疑問なのですが・・) それとUNIXとLinuxってどういう違いがあるんですか? もしかしてUNIXというのは、Linux、Solarist等の総称でしょうか??

  • UNIXのシェル、環境設定について教えてください。

    こんにちは。 UNIXについて詳しく勉強したいとおもっています。 コマンドなど基本的なファイル操作についてはある程度わかるのですが、UNIXの環境設定、環境変数、シェルなどの物につまづいています。 「環境変数って一体なんだよ!」 「シェルのBシェル、Cシェルって・・・」 こんな感じです。 これらについて初心者でもわかるような本、サイトを教えてください。 あと、初心者すぎて恥ずかしい質問なのですが、UNIX系OSにはいろいろな種類があるのは知っているのですが、「UNIX」という名前のOSはあるのでしょうか? また、Teratermを使っているのですが、これって何ていう名前のOSなのでしょうか? 最後に、会社なのでは、SolarisとLinuxどちらが多く使われているのでしょうか? これらの質問に詳しい諸先輩方アドバイスの方をよろしくお願いします。

  • ファイルを開く、ストリームを結びつける、とは?

    C言語の標準関数の説明の中に、 「ファイルを開く」 「ストリームと結びつける」 といった表現がでてくるのですが、これはどういう意味ですか? freopenを理解しようとしていたのですが・・・。 ファイルを開くとはFILE構造体を展開する?ファイルディスクリプタをシステムに登録する?・・・意味がいまいち掴めません。「ストリームと結びつける」も同様です。 これらは具体的にどういう意味なのでしょうか?回答よろしくお願いします。

  • VC++のプロジェクトをUnixで実行できるようにしたい

    最近,C++の勉強を始めた素人です。 現在,Visual C++ 2008を使用しプログラムを組んでいます。 そのため,コンパイル等はビルドを実行するだけで簡単なのですが,実行の効率化のため作成したプロジェクトをUnix環境でも実行したいです。 そのためには、makefileを作成して,Unix環境でmakeすればよいと思うのですが,人から譲り受けたプログラムに組み込んで作成しているため、ファイルの数が大規模で、ライブラリなどもありmakefileをどう作ったらいいか分かりません。 素人にもわかりやすい、できるだけ簡単に、VC++のプロジェクトからUnix環境で実行できるmakefileを作成する方法はないのでしょうか? 回答よろしくお願いします。

  • sshとftpの違いとsshの利点

    sshでのサイト管理を検討しておりますが 経験談をお聞きしたく投稿させていただきます。 当方wordpressにてサイト構築をしており、先日サイト改ざんの 被害もあったこと、サーバ環境の関連でssh接続を検討しております。 今まではftp接続でファイルのやり取りをしておりましたためGUIで 作業をすることができましたが、sshは基本的にCUIでの操作となると思います。 当方コマンドプロントなど使用経験がある。という程度のものですが sshはセキュリティ的にもよさそうですし、自分の知識として CUIの世界ものぞいてみたいという気持ちもあります。 そこでsshはどのような利点があるのか伺いたいです。 私はサイトのファイル管理に使おうと考えておりますが その他便利な使い方、利点などはあるのでしょうか。 当方macbookにてブートキャンプ(xp、ノートンインターネットセキュリティ)の環境ですが やはりリナックスの環境を構築したほうがより利点があるのでしょうか。

  • ディレクトリの作成

    今自作プログラムをつくっている大学生です。 C++で、ファイルの作成、ファイルからの書き込み、読み込みは、ifstream,ofstreamを使ってできるのですが、UNIXで、プログラム内での操作で新しいディレクトリを作りたいと思っているのですが、どうやったらいいかわかりません。 知っている方がいたら、書式等なるべく詳しく教えて下さい。よろしくお願いします。

  • 4Gバイトのファイルを開くには?

    C初心者です。 稼動環境はUNIX(AIX)です。 4Gバイトのテキスト・ファイルを処理しなければならないのですが、fopen()を使用すると、エラーが出て開くことができません。 動的にメモリを割り当てればよいのかな?と思いますが具体的な方法がわかりません。 どなたか教えていただけますか?

  • 文字コードについて

    仕事場のワークステーションがUNIX→Linuxに移行することが決まりました。 そこで現在使用しているUNIXのプログラムをLinuxにコピーしたのですが、文字コードがおかしいのか文字化けして動作しません。 動作としては プログラムを立ち上げる    ↓ 環境設定ファイルを読み込む    ↓ 上手く起動する 正常なら上記の動作ですが、環境設定ファイルが読み込めず停止してしまいます。 そこで環境設定ファイルを開くと文字化けしてました。 その後、今までのUNIX上での環境設定ファイルをlessで表示させ、 新たなLinuxマシンにviでコピー・ぺ-ストして保存したところ 正常に動作しました。 操作は別端末のTeraTaermで行っています。 これはLinuxマシンの文字コードがUTF-8のためEUCが認識できないからでしょうか? 行き詰ってますので、どうかお願いいたします。 Linuxの環境は Red Hat 8.0のエンタープライズ版です。