MSG_WAITALL和文件描述符的阻塞模式

来源:互联网 发布:豆瓣交友软件 编辑:程序博客网 时间:2024/06/16 11:41

recv函数可以设置一些标志,这也是recv和read的不同之处。

其中有一个MSG_WAITALL标志,如果recv设置了这个标志,当没有收到请求的字节数时,recv函数会阻塞。然而,当被信号打断,或者发生了错误,或者断开了连接,或者接收到的下一个数据和已经接收的数据的数据类型不一致时,recv函数即使没有收到请求的字节数,也会返回,返回一个错误。

由此可见,设置了MSG_WAITALL标志的recv函数,类似于前文的readn函数,不同的是readn函数对被信号打断的情况进行了处理,而MSG_WAITALL则没有进行处理。

既然该标志可以使recv函数阻塞,那这和文件描述符的阻塞模式相比,有什么区别呢?

如果文件描述符处于阻塞模式,执行recv操作时,如果接收缓冲区没有数据,会一直阻塞,直到接收缓冲区有数据。然而,设置了MSG_WAITALL的recv,即使缓冲区有数据,只要数据字节数小于请求字节数,recv就会阻塞。

可见,MSG_WAITALL和文件描述符的阻塞模式,发生阻塞的是两个阶段。

原创粉丝点击