多分私はそれを見逃しているかもしれませんが、ファイル記述子のfprintfに相当する関数ではありません。それらの間にフリップフロップ?ファイル記述子のための "fprintf"のような関数(FILE * fpの代わりにint fd)
答えて
あなたは(ないCまたはPOSIXで、GNU拡張)dprintf
になります:
関数DPRINTF()とvdprintf() は(glibc2ではライブラリに見られるような) 正確な類似体でありますfprintf()と vfprintf()は、 指定されたストリームの代わりに にファイル記述子fdを出力します。
EDITコメントであなたのいくつかで指摘したように、POSIX 2008は、これらの機能を標準化しました。
いいえ、標準ではありませんが、2つの異なることを行います。 fprinftはstdioの一環として、バッファの読み書きのような処理を行い、ungetcなどをサポートします。fdを使用すると、すべてが無視され、OSが直接呼び出されます。
したがって、これらは互換性がありません。ファイルディスクリプタにprintf
を行うにはCやPOSIX標準の機能はありません他の
それは私が思ったものですが、100%確実ではありませんでした。 – Will
...あなたは 'fdopen'を行うことができ、必要に応じて' flush() 'を覚えている限り、フリップフロップはうまく動作します。 –
おそらく、保証はされていませんが、あなたが別のポジションを狙うならおそらく動作しません。 –
何もない場合は、それらの間のフリップばたつきはstdioのバッファリングを台無しだろうが、あなたはfdopen(int desc, const char *mode)
POSIX標準でFILE *
としてファイルディスクリプタを「開く」ことができます。私は、ディスクリプタを直接使用することにどのくらいうまく対応しているのか分かりませんが、まずバッファをフラッシュすれば動作するかもしれませんね...
もちろん、vsprintf
明らかにあなたはバッファリングの世話をする必要があります。
私はfdopenを考えていましたが、実際には別のハンドルを "開く"ことは望ましくありません。特にIIRCがそのハンドルでfcloseを呼び出すと、基礎となるファイル記述子も閉じます。ルーチンがファイル記述子またはソケットハンドルのいずれかを取得する可能性があるため、これは私が作業しているコードの問題です。 – Will
@Will: 'dup'から取得したファイルを' fdopen'することができます。その結果、元のfdには影響しません – Hasturkun
@Hasturkun:そうです、私はdupを忘れました。私が定期的に使用する機能の1つではありません。 – Will
fprintf()
で処理できる通常のファイルとしてファイルディスクリプタを開くことができます。ファイル名はfdopenです。何が価値があるために
、dprintf
はPOSIX関数ではありませんので、移植性が問題になる場合、1は以下を使用することができます。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
int
fdprintf (int fd, size_t bufmax, const char * fmt, ...)
{
char * buffer;
int n;
va_list ap;
buffer = (char *) malloc (bufmax);
if (!buffer)
return 0;
va_start (ap, fmt);
n = vsnprintf (buffer, bufmax, fmt, ap);
va_end (ap);
write (fd, buffer, n);
free (buffer);
return n;
}
ほとんどのwrite
の戻り値を確認したいが、あなたはなるだろうが一般的なアイデア。明らかに、これはFILE *
ルーチンのようにバッファしません。私は、書式指定子と、書かれているときにデータをバッファリングすることを心配するのではなく、ファイル記述子に書き込まれる文字データを構築する機能を探していました。
'dprintf'はPOSIX(2008年現在)であり、データを静かに切り捨てる関数は通常非常に悪い考えです。成功するか、失敗を返すまで、大きなバッファで少なくともループしてください... –
これはクールです。私のgccのバージョンは少し古いですが、 'dprintf'はまだGNU拡張だけであると表示されます。 – Will
- 1. ファイルポインタの代わりにファイル記述子を持つgetline()
- 2. Cのファイル記述子を開く
- 3. ioctl()with JNI:壊れたファイル記述子
- 4. ファイル記述子の位置
- 5. マルチスレッドアプリケーションでのソケットファイル記述子(sock fd)の作成
- 6. D Python記述子のようなメタプログラミング?
- 7. Bash:ファイル記述子のリダイレクト
- 8. poll関数の記述子を作成する
- 9. ソケットとファイル記述子
- 10. epollファイル記述子操作
- 11. 不正なファイル記述子のエラー処理
- 12. fgetsの(FILE *)fpとfpの違いは?
- 13. ファイル記述子とシステムコール
- 14. 代わりインデックスのWMI Win32_Processor.Familyプロパティの記述値を取得
- 15. =記号の代わりに
- 16. Bashスクリプトの関数からファイル記述子が漏れる
- 17. Java NIOによりファイル記述子のリークが発生する
- 18. ファイル記述子付きのオープン・リード・ファイル
- 19. パイプのファイル記述子にエラーがあります
- 20. FILE *の内容をファイル記述子にコピーする方法はありますか?
- 21. c strcpyファイル記述子
- 22. ジェネリックキャスト関数の記述Scala
- 23. なぜexec {fd} <fileはファイルのファイルディスクリプタをfdに割り当てるのですか?
- 24. webservice記述子ファイル
- 25. ファイル記述子からFILE *ストリームを取得する方法は?
- 26. WPFのようにマルチバインディングのためのUWPの代わりに?
- 27. 成功した後のファイル記述子の無効化
- 28. C++でのファイル記述子のなりすまし
- 29. ファイル記述子に書き込む際のepollの動作
- 30. ファイル記述子が間違った値を返す
ありがとうございました!非常に興味深い、それらが存在することを知らなかった。 –
私はこのアプリはLinux上でしか動作しないので、これが私の必要なものかもしれません。クロスプラットフォームの互換性は問題にならないので、GNU拡張モジュールを使用すると問題はありません。 – Will
マニュアルページに、現在POSIX.1-2008に入っていると書かれています。 – nategoose