web-dev-qa-db-ja.com

ファイルポインタを使用せずにファイルを「読み取る」

私はインタビューでこの質問をされました。どういうわけか、ファイルポインター(fgets、fscanfなどの「f」関数を含む)を使用せずに、ファイルを入力としてCプログラムに「読み込む」ことになっています。端末を使用してリダイレクトすることもできません。つまり、システムコールやexecコールはありません。プログラムは実行時にファイルを取得しません。

どうしたらこれが可能になるのか知りたいのですが。

7
Khushman Patel

ファイルポインタは、POSIXシステム上のファイルにアクセスするための唯一の方法ではありません(明らかにLinuxです)。
実際、FILE構造体は、クロスプラットフォームの方法でファイルを操作しやすくするために存在します(fopen()はLinux、Mac OSの両方で動作しますX、任意のBSDおよびWindows)および透過的バッファリングなどのいくつかの機能を提供します(バッファI/Oの方がはるかに高速です)。
これは、逆効果でない場合(多くのプロセスからの共通アクセスのためにファイルを同期する必要がある)または危険な場合(バッファリングされた出力が必要に応じてフラッシュされず、ファイルが不適切に中断された場合の不良状態)。今、私は専門家ではなく、これらの問題は存在しないかもしれませんが、POSIXによって提供される低レベルのAPIを使用する理由は確かにあります:ファイル記述子メカニズム、open()read()write()close()およびmmap()

これらの関数は、少なくともLinuxでのFILE*抽象化のビルディングブロックであり(straceを使用してサンプルファイルI/Oプログラムを実行することでテストできます)、必要に応じて使用できます。ファイルへの直接アクセス。

これはおそらく、インタビュアーが予期していた問題の解決策です。彼があなたにこれを知ってほしいと思うかもしれない理由は、あなたが組み込みシステムの仕事のために面接を受けた場合です。基礎となるシステムの知識は、そのような立場で不可欠です。

私はかつてLinuxプログラミングの第一人者に出会いました。彼は、標準ライブラリ全体を自分で少なくとも1つのプラットフォームに自分自身で大きな問題なく実装できれば、Cを知っていると主張できるかもしれないと彼に言いました。特定のドメインでは、低レベルの知識が必要です。

19
K.Steff