linux write():它是否尝试尽可能多地写入字节?

时间:2012-12-25 18:05:06

标签: linux network-programming

如果我以这种方式使用writewrite (fd, buf, 10000000 /* 10MB */)其中fd是套接字并使用阻塞I / O,内核是否会尝试刷新尽可能多的字节,以便仅一个电话就足够了?或者我必须根据其返回值多次调用write?如果发生这种情况,是否意味着fd出现问题?

============================== EDITED ================ ================

感谢所有答案。此外,如果我将fd放入poll并且它与POLLOUT成功返回,则无法阻止对write的调用并写入所有数据,除非fd出现问题1}}?

2 个答案:

答案 0 :(得分:3)

在阻塞模式下,write(2)仅在写入指定的字节数时返回。如果它不能写它会等待。

在非阻塞(O_NONBLOCK)模式下,它不会等待。它会回来的。如果它可以写出所有这些,那将是一个成功,否则它将相应地设置errno。然后,您检查了errno EWOULDBLOCKEAGAIN是否必须调用相同的write agian。

来自write(2)

的手册
  

例如,如果底层物理介质上没有足够的空间或RLIMIT_FSIZE资源,则写入的字节数可能小于count          遇到限制(参见setrlimit(2)),或者在写入少于count个字节后,调用被信号处理程序中断。 (另见管道(7)。)

是的,fd可能有问题。

还要注意这个

  

从write()成功返回并不能保证数据已提交到磁盘。事实上,在一些错误的实施,它甚至没有瓜尔 -          已成功为数据保留空间。唯一可以确定的方法是在写完所有数据后调用fsync(2)。

答案 1 :(得分: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

另一点 - TCP是一个双向门,所以仅仅因为你可以一次发送数十亿字节并不意味着另一方可以读取它甚至处理它。你的插座可能会阻塞一段时间。可能你的write()返回值可能比你希望的要少。