我正在学习poll
,select
和类似的功能,我不断地被声明所困扰"会阻止" (在我正在阅读的关于为Linux构建驱动程序的书以及poll
和select
的手册页上都显示了这两本书)。我真的不明白。什么会被阻止?正在读/写文件描述符的过程?读/写操作本身,在当前进程正在读/写时,没有其他进程能够读/写该文件?
如果这是一个愚蠢的问题,我很抱歉,但我很难在任何地方找到这个问题的答案。
答案 0 :(得分:3)
阻塞意味着进行系统调用的进程将阻塞(等待),直到系统调用返回。例如,如果您要求程序读取文件,则在发出读取命令后,程序将等待(阻止),直到操作系统执行读取并将结果返回给您的程序。
对于访问同一文件的多个程序,多个进程可以读取同一个文件。但是,当一个或多个进程正在写入一个或多个进程读取同一文件的文件时,您可以(并且通常会)具有竞争条件。换句话说,阻塞是关于访问文件的单个进程,并且不保证访问同一文件的两个进程之间的操作顺序(例如读取和写入)。 (我出于某种原因考虑了文件;管道和套接字的读/写特性与文件系统上的文件有很大不同。)
答案 1 :(得分:2)
除了jeffs正确答案:
但是,如果以非阻塞模式(O_NONBLOCK)打开相应的文件描述符,则可以以非阻塞方式使用大多数系统调用。 该调用将始终立即返回,但如果失败则返回errno中的EWOULDBLOCK(并且没有有效数据),您需要在应用程序或驱动程序中自行处理。
答案 2 :(得分:1)
让我换一种说法。
1)正常I / O是“阻塞”。发出“读取”,程序“等待”直到数据到达或发生错误(或超时)。
2)非阻塞I / O“不同”。你需要一些方法来判断你是否已经“完成”。
3)对于“读取”,EWOULDBLOCK说“没有任何数据”。它说“如果这是'正常的I / O',那么我会阻止”。
4)对于“写入”,EWOULDBLOCK表示“第一个缓冲区尚未完全发送并已确认 - 您可能希望在发送任何其他内容之前暂缓。”
两个链接: