c

时间:2016-07-14 13:14:55

标签: c linux sockets posix

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

2 个答案:

答案 0 :(得分:1)

  

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

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

首先,人们称之为"系统缓冲区"是另一个所谓的"套接字缓冲区",但它们是相同的。

其次,当第一个语句说" write()只在套接字缓冲区已满时阻塞"这应解释为" write()仅在写操作溢出(系统)缓冲区时阻塞"。这与&#34相同;写入()被阻止,直到用户缓冲区中的所有数据都被移动到系统缓冲区为止#34 ;;只是一个人说这个条件会导致write()被阻塞而另一个人说这个条件会在条件变为假时停止。这并不矛盾。

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