0

我正在 Linux 上开发串行端口应用程序,当 select () api 检查等待句柄上的数据时,一旦数据到达端口,它就会返回正值,但 read() api 调用返回 -1,这怎么可能?

4

1 回答 1

1

以下是手册页所说的select

select() 和 pselect() 允许程序监视多个文件描述符,等待一个或多个文件描述符“准备好”用于某种类型的 I/O 操作(例如,可能的输入)。如果可以在没有阻塞的情况下执行相应的 I/O 操作(例如 read(2)),则认为文件描述符已准备就绪。

如果文件描述符(例如,为网络套接字接收到的 RST 段)上存在错误情况,则通知当前阻塞的进程的唯一方法select是使该描述符为 IO 做好准备。随后的读/写函数将返回一个错误,以便应用程序可以处理它。

此行为看起来符合select承诺 - 如果您可以在其上执行非阻塞IO,则将描述符标记为准备就绪(但是,在某些情况下使用网络套接字,当描述符被标记为准备好读取时,但随后的读取操作块)。您不会在读取时阻止 - 立即返回错误。

至于 的返回状态select,它应该只返回所有集合中文件描述符的“就绪事件”的数量。如果 select 本身失败(被系统调用中断,例如 - errno == EINTR),它可能是负面的,但当正在监视的描述符上发生一些错误时则不会。

于 2012-08-07T07:31:51.873 回答