poll(fds, 1, 0) 在这里是一个阻塞调用,尽管超时设置为0。在Linux中,poll函数的行为如下:
当超时设置为-1时,poll会无限期地等待,直到至少有一个文件描述符变得可读、可写或有异常状况,或者直到接收到一个信号。
当超时设置为一个正整数N时,poll会等待最多N毫秒。如果在N毫秒内没有文件描述符变得可用,poll会返回0。
当超时设置为0时,poll会立即返回,不会阻塞。但是,如果此时正好有文件描述符是就绪的(即满足poll之前设置的事件),poll会返回并报告这些文件描述符。
因此,对于poll(fds, 1, 0)这个调用,它不会阻塞等待文件描述符变得可用。它会立即返回,并告诉你是否有文件描述符在调用poll的那一刻就已经是就绪的。如果没有文件描述符就绪,poll会返回0。
然而,这并不意味着整个操作是非阻塞的。你仍然需要在调用poll之后检查返回的结果,并根据返回的文件描述符状态进行读取或写入操作。如果文件描述符是设置为非阻塞模式的,那么读取或写入操作本身也可能是非阻塞的。但如果文件描述符是阻塞模式的,读取或写入操作可能会阻塞。
所以,poll(fds, 1, 0)本身是非阻塞的(因为它不会等待),但是后续的文件操作可能是阻塞的或非阻塞的,这取决于文件描述符的设置。如果你想要整个操作都是非阻塞的,你需要确保文件描述符本身也是设置为非阻塞模式的。