我已经在线阅读了一些关于套接字编程的资料。默认情况下,write()
被阻止。在某些材料中,当套接字缓冲区已满时,write()
仅会阻止。一些其他材料说write()
被阻塞,直到用户缓冲区中的所有数据已被移动到系统缓冲区,这意味着如果没有足够的空间放置数据,则write()
也会被阻止。我想知道如果write()
设置为阻止哪个语句是正确的。非阻塞式写入c
非阻塞式写入c
回答
当描述符是套接字时,write函数的行为与send()函数类似。如果内部缓冲区已满并且可以发送所有数据,write()函数将会阻塞。这假定套接字被阻塞。请记住,写入功能可能会被信号中断; errno将被设置为EINTR(返回值将是捕获信号时写入的字节数),并且可以再次调用write()直到发送所有数据。
参见
http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html http://pubs.opengroup.org/onlinepubs/009695399/functions/send.html
在上面发布的send()函数的链接上,它表示如果发送套接字上的空间不可用来保存要发送的消息,并且套接字文件描述符没有设置O_NONBLOCK,则send()应该阻塞直到空间可用。所以也许这就是你正在寻找的答案。至于“直到所有数据都可以发送”我写道,我的意思是说,直到所有传递给write()函数的数据都写入内部缓冲区。我为宽松的语言表示歉意,并不是要误导你。 –
在一些材料,写()只块时插座缓冲区已满。其他一些材料说write()被阻塞,直到用户缓冲区中的所有数据都被移动到系统缓冲区,这意味着如果没有足够的空间放置数据,write()也会被阻塞。
我不清楚这些实际上是在说什么不同的东西。
首先,被称为“系统缓冲区”的是另一个被称为“套接字缓冲区”的东西,但它们是相同的东西。其次,当第一条语句表示“write()仅在套接字缓冲区已满时阻塞”时,应将其解释为“write()仅在写入操作溢出(系统)缓冲区时阻止”。这与“write()被阻塞直到用户缓冲区中的所有数据已被移动到系统缓冲区”相同。它只是说一个条件会导致write()被阻塞,另一个说该条件会在条件变为false时停止。这并不矛盾。
- 1. 非阻塞写入和阻塞recv
- 2. UDP非阻塞式写入失败
- 3. 非阻塞式输入python2.7
- 4. C#非阻塞Socket.Connect()
- 5. 非阻塞方式
- 6. mpi:阻塞与非阻塞
- 7. c中的非阻塞输入
- 8. 非阻塞控制台输入C++
- 9. 在C++中正确写入非阻塞套接字
- 10. C中的非阻塞sendmail
- 11. 非阻塞计时器C++
- 12. C#:非阻塞睡眠
- 13. C++非阻塞ASIO运行
- 14. PHP Inotify非阻塞方式
- 15. 非阻塞方式的Kombu
- 16. NIO非阻塞模式
- 17. 将OpenSSL BIO从阻塞模式更改为非阻塞模式
- 18. 非阻塞django?
- 19. 非阻塞setTimeout
- 20. 非阻塞spmd
- 21. 非阻塞pthread_join
- 22. PyGTK非阻塞
- 23. Javascript非阻塞
- 24. 非阻塞stdio
- 25. 带延迟的阻塞/非阻塞
- 26. 嵌套Socket阻塞非阻塞SocketHi
- 27. 非阻塞PASV袜子和阻塞
- 28. 是renderer.render()阻塞还是非阻塞?
- 29. 非阻塞键盘读取 - C/C++
- 30. C/C++套接字和非阻塞recv()
是哪个插座?视窗? –
@o_weisman感谢您的回复。 Linux系统。 – HuangJie
我建议你将问题的操作系统添加为标签。 – sjsam