問題タブ [fdopen]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python - 「開いているファイルへの OS レベルのハンドル」をファイル オブジェクトに変換するにはどうすればよいですか?
開いているファイルへの OS レベルのハンドル (os.open() によって返される) とそのファイルの絶対パス名をこの順序で含むタプル。
その OS レベルのハンドルをファイル オブジェクトに変換するにはどうすればよいですか?
os.open()のドキュメントには次のように記載されています。
ファイル記述子を「ファイル オブジェクト」にラップするには、fdopen() を使用します。
だから私は試しました:
c - fdopenの呼び出し:不正なファイル記述子
プログラムをコンパイルしようとすると、次のエラーが発生します。
calling fdopen: Bad file descriptor
これは、プリコンパイル済みヘッダーをヘッダーファイルの1つに含めることに関連する問題である可能性があることを読みました。エラーの原因となっているファイルにはstdio.hヘッダーが含まれているため、FILEタイプにアクセスできます。これを削除するとエラーは消えますが、FILEタイプは使えません。誰かが私がこれを修正する方法を知っていますか?
c - ファイル記述子を作成する
コードで値を指定するファイル記述子を C で作成したいと考えています。作成するファイル記述子の値を指定する整数変数があります。たとえば、値が 5 のファイル記述子が必要な場合があり、後でそれを "sample.dat" という名前のファイルに関連付けます。
c - 空でない読み取りバッファを持つソケットストリームを操作するときの「不正なシーク」エラー
私は現在、Linux x86_64
を使用してサーバーアプリケーションを作成しています<sys/socket.h>
。を介して接続を受け入れた後、取得したソケットをストリームにラップするためaccept()
に使用します。fdopen()
FILE*
そのストリームへの書き込みとそのストリームからの読み取りはFILE*
通常非常にうまく機能しますが、空でない読み取りバッファーがあるときにソケットに書き込むとすぐにソケットは使用できなくなります。
デモンストレーションの目的で、接続をリッスンし、を使用して入力を1行ずつ読み取りバッファーに読み取るコードを記述しましたfgetc()
。行が長すぎてバッファに収まらない場合は、完全には読み取られませんが、代わりに次の反復中に読み取られます。
コードは、特別なパラメーターなしでgccでコンパイルする必要があります。ポート番号を引数として実行し、netcatを使用してローカルに接続します。
これで、8文字より短い文字列を送信しようとすると、これは問題なく実行されます。ただし、10文字を超える文字列を送信すると、プログラムは失敗します。このサンプル入力:
この出力を作成します:
ご覧のとおり、(正しく)abcdefghの最初の8文字のみが読み取られますが、プログラムが「ack」文字列(クライアントが受信することはありません)を送信しようとすると、Illegal seek
エラーが発生し、次の呼び出しfgetc()
はEOFを返します。
fflush()
パーツがコメントアウトされている場合でも、同じエラーが発生しますが、
サーバー出力に行がありません。
fputs(ack)
パーツがコメントアウトされている場合、すべてが意図したとおりに機能しているように見えますが、gdbから手動で呼び出されたperror()は、「不正なシーク」エラーを報告します。
fputs(ack)
との両方fflush()
がコメントアウトされている場合、すべてが意図したとおりに機能します。
残念ながら、この問題に関する優れたドキュメントやインターネットでの議論は見つかりませんでした。ご協力いただければ幸いです。
編集
私が最終的に解決した解決策は、とを使用しないことです。これは、ソケットfdをモードで確実に使用できるに変換するクリーンな方法がないように思われるためです。代わりに、私はソケットfdに直接取り組み、との独自の置換コードを記述しました。fdopen()
FILE*
FILE*
r+
fputs
fprintf
誰かがそれを必要とするならば、ここにコードがあります。
c - fgetsおよびfprintfと互換性のあるファイルロック
私はファイルロックのためにhttp://beej.us/guide/bgipc/html/multi/flocking.htmlを読んでいます、今私はファイルの説明とファイルポインタ(私はfprintfとfgetsが必要です)の両方を操作する方法を理解しようとしています、これコードは実際には機能しますが、fdopenに割り当てられたフラグが正しいかどうかわかりません。これは、続行するための良い方法ですか?
c - 同じモードとフラグでオープンとしてfdopenする方法は?
FILE*
使用するタイプが欲しいのですがfprintf
。を返す代わりにfdopen
を取得するために使用する必要があります。しかし、とで同じことができますか?(私は使用したことがありません)FILE*
open
int
fdopen
open
fdopen
私は同じことをしたいですfdopen
:
python - 「with」を使用して「os」からファイルオブジェクトを開く方法は?
以下のように「os.open()」を使用してファイルを開こうとしています
接続を自動的に閉じることができるように、「with」を使用して os.fdopen からファイルオブジェクトを開く方法はありますか?
ありがとう
c - FILE* からファイル記述子をレスキューすることは可能ですか?
FILE*
オブジェクトを渡す特定のクロスプラットフォーム ライブラリを使用する必要があります。
別のソース (継承) からファイル記述子を取得します。複数のプロセスで同じfd
状態を維持したいと考えています。fork
現在、ファイル記述子をオブジェクトfdopen
に変換するために使用しています。FILE*
私の問題は、オブジェクトのfclose
クリーンアップに使用すると、FILE*
接続されたファイル記述子が閉じられることです。
このファイル記述子が使用された後も保持したいと思います。
からファイル記述子をレスキューする方法はありますFILE*
か?
切り離す方法はありますか?
FILE*
または、ファイル記述子をダミーに置き換える方法はありますか?
PSこれはクロスプラットフォームである必要があり、とにかくPOSIX全体でうまくいきます。
c++ - fread 関数がブロックされていませんか?
次のコードがあります。
cout_file は FILE* 型で、バイナリの stdout に接続されています。そのバイナリは、5 秒間隔で std_out にテキストを出力します。
cout_file に buffer_max_size バイトが含まれるまで、fread がブロックされているようです。それは正常ですか?
ブロックせずに現在パイプにあるものを読み取れるようにしたい..それは可能ですか?