ファイルポインター(FILE * fp)をファイル記述子(int fd)に変換するにはどうすればよいですか?


174

へのFILE *呼び出しによって返されたがありますfopen()。そのような呼び出しをするために、ファイル記述子をそこから取得する必要がありますfsync(fd)。ファイルポインターからファイル記述子を取得する関数は何ですか?


または、open(2)を使用してファイルを開き、最初からファイル記述子を
取得

回答:


214

適切な機能はint fileno(FILE *stream)です。に<stdio.h>あり、POSIX標準ですが、標準Cではありません。


4
厳密に言えば、関数が実際に標準Cライブラリの一部である場合、ヘッダーやライブラリについて言及する必要はありません。ただし、これは標準ではないため、少なくともヘッダーを言及することは理にかなっています。
AnT

20
標準Cライブラリの関数にアクセスするには、少なくともコンパイラがプロトタイプを期待している場合は、ヘッダーを含める必要があります(その点で実際に標準の動作が何であるか覚えていません)。ヘッダーがない場合、Cファイルの先頭に名前は定義されません。
Phil Miller

1
@Novelocrat:#include何もする必要がないという意味ではありませんでした。標準関数の適切なヘッダーの名前を常に簡単に見つけることができることを意味しました。つまり、回答に正確なヘッダー名を含めることはそれほど重要ではありません。
AnT

9
これは良い答えですが、これは標準のc関数ではなく、posix関数であることは注目に値します。
Evan Teran

6
ファイル記述子はUNIXのものであるため、C標準にはありません(Linuxでは、open(2)であり、open(3)ではありません)。
ユーザーでないユーザー

42

fileno(FILE *)ファイル記述子を返す場合でも、stdioのバッファーをバイパスしないように十分注意してください。バッファーデータ(読み取りまたはフラッシュされていない書き込み)がある場合、ファイル記述子からの読み取り/書き込みにより、予期しない結果が生じる可能性があります。

副次的な質問の1つに答えて、ファイル記述子をFILEポインターに変換するには、以下を使用します。 fdopen(3)


1
これが具体的にこれを検索している人々に役立つとは思いません。これは、この記事が書かれる1か月前にOPの投稿のコメントセクションで既に回答されています。これは、実際の情報とは対照的に、より論理的な説明です。
kevr 2018

4
重要なコメントは回答として上げる必要があります。コメントの大部分は、あなたのような無意味で無意味なメタコメントです...そしてこれは;)
Mark Gerolimatos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.