1

このように使用する場合write:write (fd, buf, 10000000 /* 10MB */)どこfdにソケットがあり、ブロッキング I/O を使用している場合、カーネルはできるだけ多くのバイトをフラッシュして、1 回の呼び出しだけで十分になるようにしますか? writeまたは、戻り値に応じて数回呼び出す必要がありますか? それが起こる場合、それは何かが間違っていることを意味しfdますか?

==============================編集================== =============

すべての答えをありがとう。さらに、 を入れfdpollで正常に返された場合POLLOUT、 への呼び出しはブロックできず、 ?writeに何か問題がない限り、すべてのデータを書き込みます。fd

4

2 に答える 2

3

ブロッキングモードでは、write(2)は、指定されたバイト数が書き込まれた場合にのみ戻ります。書き込めない場合は待機します。

ノンブロッキング ( O_NONBLOCK) モードでは待機しません。その度に返ってきます。それらのすべてを書き込むことができれば成功です。それ以外の場合は、それに応じて errno を設定します。次に、同じエイジアンを呼び出す必要があるerrnoかどうかEWOULDBLOCKを確認します。EAGAINwrite

の説明書よりwrite(2)

たとえば、基礎となる物理メディアに十分なスペースがない場合、RLIMIT_FSIZE リソース制限に達した場合 (setrlimit(2) を参照)、呼び出しがシグナルハンドラによって中断された場合などに、書き込まれるバイト数が count より少なくなることがあります。 count バイト未満の書き込みがありました。(pipe(7)も参照してください。)

そうです、何か問題がある可能性がありますfd

これにも注意

write() から正常に戻っても、データがディスクにコミットされているという保証はありません。実際、一部のバグのある実装では、スペースがデータ用に確保されていることさえ保証されません。確実にする唯一の方法は、すべてのデータの書き込みが完了した後で fsync(2) を呼び出すことです。

于 2012-12-25T18:11:21.147 に答える
0

/etc/sysctl.conf は、Linux で TCP プロトコルのパラメーターを設定するために使用されます。これは、ソケットの意味であると想定しています。そこには多くのパラメータがあるかもしれませんが、それを掘り下げると、基本的にTCPバッファが一度に保持できるデータ量には制限があります.

したがって、一度に 10 MB のデータを書き込もうとすると、write はそのssize_t値と等しい値を返します。write() システムコールの戻り値を常に確認してください。システムが 10MB を許可している場合、write はその値を返します。

値は

net.core.wmem_max = [some number]

ある数値を 10MB を許可するのに十分な大きさの値に変更すると、それだけの量を書き込むことができます。そうしないでください!他の問題を引き起こす可能性があります。何かをする前に設定を調べてください。設定を変更すると、パフォーマンスが低下する可能性があります。気をつけて。

http://linux.die.net/man/7/tcp

TCP 設定に関する基本的な C 情報があります。/proc/sys/netまた、あなたのボックスをチェックしてください。

もう1つのポイント-TCPは双方向のドアであるため、一度に無数のバイトを送信できるからといって、反対側がそれを読み取ったり処理したりできるとは限りません。あなたのソケットはしばらくブロックするかもしれません。また、write() の戻り値が、期待したよりも小さい可能性があります。

于 2012-12-26T03:53:33.117 に答える