我问这个问题,因为我正在寻找使用epollwait
的Go中的多路复用I / O。
[当套接字准备就绪时,goroutine将被唤醒并开始以非阻塞模式读取套接字。如果read
系统调用在将数据从内核复制到用户的过程中仍将被阻止,则我认为附加到gorouine的内核线程也将进入睡眠状态。
我不确定,如果我错了,希望有人可以帮助纠正我。
write(2)
和read(2)
系统调用(以及它们类似的系统调用,例如send(2)
和recv(2)
) 非阻塞模式可以自由消耗(并分别返回)少于请求的数据。换句话说,在非阻塞套接字上的write(2)
调用被告知要写入1兆字节的数据,将消耗与关联的内核缓冲区中当前可容纳的数据相同的数量,并立即返回,表示仅消耗了相同的数据。下一次立即调用write(2)
可能会返回EWOULDBLOCK
。
read(2)
调用也是如此:如果向它传递一个足以容纳1兆字节数据的缓冲区,并告诉它读取该字节数,则该调用只会耗尽内核缓冲区的内容并返回立即发出信号,说明实际复制了多少数据。下一次立即调用read(2)
可能会返回EWOULDBLOCK
。
EAGAIN
返回代码。当然,在执行此类syscall的过程中,可能存在OS线程被挂起的可能性,但这不算作“阻塞
in
syscall。”