典型的一次IO的两个阶段是什么?数据准备/就绪(监听)和数据读写
??????
????????阻塞的时候,线程会被处于挂起状态。如果有数据则返回,也可能出现错误返回-1;
????????非阻塞的时候,线程会执行,遇到recv会直接返回值,返回-1时,会出现errno错误,比如中断引起的EINTR、EAGAIN、EWOULDBLOCK。
EINTR (Interrupted System Call):
- 意义:系统调用被中断。
- 发生情况:当进程收到信号时,可能会中断正在进行的系统调用。当信号处理程序执行完毕后,系统调用可能会返回这个错误码,表示调用被中断。程序员通常需要重新发起系统调用。
EAGAIN (Resource temporarily unavailable):
- 意义:资源暂时不可用。
- 发生情况:在非阻塞I/O中,当操作无法立即完成(例如,读取或写入没有数据可用或缓冲区已满)时,系统调用可能返回 EAGAIN。这并不表示错误,而是指出应用程序应该稍后再次尝试。
EWOULDBLOCK (Operation would block):
- 意义:操作将会阻塞。
- 发生情况:与 EAGAIN 类似,EWOULDBLOCK 也表示在非阻塞I/O中,操作无法立即完成,但这两个错误码在实际使用中通常是相同的。在许多系统中,EAGAIN 和 EWOULDBLOCK 被定义为相同的值。