2016-07-14 139 views
-2

我已经在线阅读了一些关于套接字编程的资料。默认情况下,write()被阻止。在某些材料中,当套接字缓冲区已满时,write()仅会阻止。一些其他材料说write()被阻塞,直到用户缓冲区中的所有数据已被移动到系统缓冲区,这意味着如果没有足够的空间放置数据,则write()也会被阻止。我想知道如果write()设置为阻止哪个语句是正确的。非阻塞式写入c

+0

是哪个插座?视窗? –

+1

@o_weisman感谢您的回复。 Linux系统。 – HuangJie

+0

我建议你将问题的操作系统添加为标签。 – sjsam

回答

0

当描述符是套接字时,write函数的行为与send()函数类似。如果内部缓冲区已满并且可以发送所有数据,write()函数将会阻塞。这假定套接字被阻塞。请记住,写入功能可能会被信号中断; errno将被设置为EINTR(返回值将是捕获信号时写入的字节数),并且可以再次调用write()直到发送所有数据。

参见

http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html http://pubs.opengroup.org/onlinepubs/009695399/functions/send.html

+0

在上面发布的send()函数的链接上,它表示如果发送套接字上的空间不可用来保存要发送的消息,并且套接字文件描述符没有设置O_NONBLOCK,则send()应该阻塞直到空间可用。所以也许这就是你正在寻找的答案。至于“直到所有数据都可以发送”我写道,我的意思是说,直到所有传递给write()函数的数据都写入内部缓冲区。我为宽松的语言表示歉意,并不是要误导你。 –

1

在一些材料,写()只块时插座缓冲区已满。其他一些材料说write()被阻塞,直到用户缓冲区中的所有数据都被移动到系统缓冲区,这意味着如果没有足够的空间放置数据,write()也会被阻塞。

我不清楚这些实际上是在说什么不同的东西。

首先,被称为“系统缓冲区”的是另一个被称为“套接字缓冲区”的东西,但它们是相同的东西。其次,当第一条语句表示“write()仅在套接字缓冲区已满时阻塞”时,应将其解释为“write()仅在写入操作溢出(系统)缓冲区时阻止”。这与“write()被阻塞直到用户缓冲区中的所有数据已被移动到系统缓冲区”相同。它只是说一个条件会导致write()被阻塞,另一个说该条件会在条件变为false时停止。这并不矛盾。