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