3

我正在学习poll,select和类似的功能,我经常被“会阻塞”的说法所困扰(这既出现在我正在阅读的关于为 Linux 构建驱动程序的书上,也出现在 和 的手册页上pollselect。我真的不明白这一点。什么会被阻止?正在读取/写入文件描述符的进程?读/写操作本身,从某种意义上说,当当前进程正在读/写该文件时,没有其他进程能够读/写该文件?

如果这是一个愚蠢的问题,我很抱歉,但我很难在任何地方找到这个问题的答案。

4

3 回答 3

3

将阻塞意味着进行系统调用的进程将阻塞(等待)直到系统调用返回。例如,如果您要求您的程序读取文件,在发出 read 命令后,您的程序将等待(阻塞),直到操作系统执行读取并将结果返回给您的程序。

对于多个程序访问同一个文件,多个进程可以读取同一个文件。但是,当一个或多个进程正在写入一个有一个或多个进程读取同一文件的文件时,您可以(并且通常会)出现竞争条件。换句话说,阻塞是关于访问文件的单个进程,并且不保证访问同一文件的两个进程之间的操作顺序(例如读取和写入)。(出于某种原因,我在考虑文件;管道和套接字的读/写特性与文件系统上的文件有很大不同)。

于 2012-09-24T15:49:30.457 回答
2

除了杰夫斯的正确答案:

但是,如果您以非阻塞模式 (O_NONBLOCK) 打开相应的文件描述符,则可以以非阻塞方式使用大多数系统调用。该调用将始终立即返回,但如果失败,它会在 errno 中返回 EWOULDBLOCK(并且没有有效数据),您需要在应用程序或驱动程序中自行处理。

于 2012-09-24T16:05:37.970 回答
2

让我换一种说法。

1) 正常 I/O 是“阻塞”的。您发出“读取”指令,程序“等待”直到数据到达或发生错误(或超时)。

2) 非阻塞 I/O 是“不同的”。你需要一些方法来判断你是否“完成”了。

3) 对于“读取”,EWOULDBLOCK 表示“没有任何数据”。它的意思是“如果这是'普通 I/O',那么我会阻塞”。

4)对于“写入”,EWOULDBLOCK 表示“第一个缓冲区尚未完全发送并确认 - 您可能希望在发送其他任何内容之前推迟。”

两个链接:

于 2012-09-24T16:30:16.913 回答