0

UnixのCでブロッキングファイルと非ブロッキングファイルを作成したいと思います。まず、ブロッキング:

fd = open("file.txt", O_CREAT | O_WRONLY | O_EXCL);

そうですか?たとえば0666のようないくつかのモードオプションを追加するべきではありませんか?

ノンブロッキングファイルはどうですか?私にはこれがわかりません。

私は次のようなことを達成したいと思います:

  1. 私がそれを開いて書き込むとき、そしてそれが書き込むために開かれるとき、それは大丈夫です。そうでない場合はブロックします。
  2. 私がそれを開いてそれから読むとき、そしてそれが読むために開かれるとき、それは大丈夫です。そうでない場合はブロックします。
4

3 に答える 3

2

ファイル記述子はブロッキングまたは非ブロッキングです。ファイルはそうではありません。open()非ブロッキングファイル記述子が必要な場合は、呼び出しのオプションにO_NBLOCKを追加します。

他の操作のためにFIFOを開いているプロセスがない限り、またはO_NBLOCKを指定しない限り、読み取りまたは書き込みのためにFIFOを開くとブロックされることに注意してください。読み取りと書き込みのためにそれを開くと、open()は非ブロッキングです(すぐに戻ります)。I / O操作は、O_NBLOCKを設定するかどうかによって引き続き制御されます。

更新された質問は明確ではありません。ただし、「ファイルへの排他的アクセス」を探している場合(他の誰もファイルを開かないようにするため)、O_EXCLもO_NBLOCKも答えではありません。O_EXCLは、ファイルの作成時に何が起こるかに影響します。ファイルがすでに存在する場合、作成は失敗します。O_NBLOCKは、read()読み取ることができるデータがない場合に操作がブロックされるかどうかに影響します。POSIXのopen()説明を読んだ場合、ファイルへの「排他的アクセス」を要求できるものは何もありません。

ファイルモードに関する質問に答えるには:O_CREATを含める場合は、の3番目の引数が必要ですopen()。O_CREATを省略した場合、の3番目の引数は必要ありませんopen()。これはvarargs関数です:

int open(const char *filename, int options, ...);
于 2012-11-21T18:05:23.253 に答える
1

いくつかのモードオプションを追加するべきではありませんか?

ファイルが書き込み専用であり、存在しない場合は作成する必要があります。この場合、open()は3番目の引数も期待するため、それを省略すると未定義の動作になります。

編集:

更新された質問はさらに混乱します...

私がそれを開いて書き込むとき、そしてそれが書き込むために開かれるとき、それは大丈夫です。そうでない場合はブロックします。

なぜあなたはそれが必要なのでしょうか?書き込み用に開かれていないファイル/ファイル記述子に書き込もうとすると、write()-1が返され、に格納されているエラーコードを確認できますerrno。コードを複雑にしすぎたり混乱させたりするのではなく、この奇妙なことで何を達成しようとしているのかを教えてください。

(括弧内の注釈:

ブロッキングファイルと非ブロッキングファイルを作成したい

あれは何でしょう?

UNIXのCで

繰り返しますが、そのようなことはありません。プラットフォームに依存しないC言語があります

于 2012-11-21T16:47:25.930 に答える
1

ブロッキングファイルを何と呼んでいるのかわかりません(UnixでIOをブロックすると、IO操作はデータが利用可能になるか、確実に失敗するのを待つことを意味します。ブロックされていないIOは、存在しない場合はすぐに返されます。利用可能なデータ)。

  • O_CREATで開くときは、常にモードを指定する必要があります。

  • ファイルがすでに存在する場合(上記の点で修正された場合)、表示されるオープンは失敗します。

  • Unixには、それを除いて、排他的アクセスのためにファイルをロックする標準的な方法がありません。アドバイザリロックがあります(ただし、すべてのプログラムはプロトコルを尊重する必要があります)。一部には必須のロック拡張機能があります。受け取った知識は、ネットワークファイルシステムにアクセスするときにどちらの種類のロックにも依存しないことです。

于 2012-11-21T16:47:50.063 に答える