1

如果我write以这种方式使用:套接字write (fd, buf, 10000000 /* 10MB */)在哪里fd并使用阻塞 I/O,内核是否会尝试刷新尽可能多的字节,以便仅一次调用就足够了?还是我要write根据它的返回值调用几次?如果发生这种情况,是否意味着有问题fd

============================== 已编辑=================== ==============

感谢所有的答案。此外,如果我放入fd并且poll它成功返回POLLOUT,那么调用write不能被阻止并写入所有数据,除非出现问题fd

4

2 回答 2

3

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

在非阻塞 ( O_NONBLOCK) 模式下,它不会等待。到时候就会回来的。如果它可以编写所有这些,那将是成功的,否则它将相应地设置 errno。然后你检查它errno是否EWOULDBLOCK或者EAGAIN你必须调用相同的writeagian。

从手册write(2)

写入的字节数可能少于 count,例如,底层物理介质上的空间不足,或者遇到 RLIMIT_FSIZE 资源限制(参见 setrlimit(2)),或者调用被信号处理程序中断后写入少于 count 个字节。(另请参见管道 (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你的盒子。

还有一点 - TCP 是一个双向门,所以仅仅因为您一次可以发送数百万个字节并不意味着另一方可以读取它甚至处理它。您的套接字可能会阻塞一段时间。并且您的 write() 返回值可能比您希望的要小。

于 2012-12-26T03:53:33.117 回答