read和recv到底什么时候会block
在写webserver的时候,我调用recv()函数的方式如下:
int nread = recv(m_fd, m_buf + m_start, READ_BUFFER_SIZE - m_start - 1, 0);
注意这里长度参数,表示我想嗯读 可能读的最大长度(read buffer满)。
但我依稀记得以前使用read()
函数的时候,如果read的长度大于实际到达的数据长度,就会block住。但是recv()的时候我这么写并没有block。
看manpage,recv()的flag为0时不就是一个read()么?为什么recv()不会卡read()会卡?
看了一圈得到的结论是:
- 如果fd里没有数据,那么read()和recv()都必卡。
- 如果fd里有一些数据,但是指定的长度大于数据,read()和recv()都不会卡,不管是正常文件还是socket。
所以记错了。应该是都不会卡。