3

根据其手册页,select()系统调用提供对一个或多个文件描述符的三个不同方面的监控:它们是否准备好读取、准备好写入,或者是否“错误”或“异常情况”(语言不同)已经发生。其中哪一个应该被监控,是通过三个fd_set参数指定的,分别是readfdswritefdserrorfds。虽然有很多关于正确使用readfdsand的优秀文档和示例writefds,但我几乎找不到任何有用的东西errorfds

无论如何,出于下面讨论的原因,我errorfds尝试使用,并且确实发现了一些情况,其中select()我的 runloop 中的调用响应了它的一个文件描述符上的“异常条件”。例如,连接到 PTY 的 TTY,当后者从其主控端关闭时,会引发这种情况。

但现在呢?我知道文件描述符上发生了一些“异常情况”,但是一般来说,我如何才能找出究竟是什么原因造成的呢?光看errno肯定不会给出答案(那时它总是 0)。是否有一些ioctl我应该注意的“神奇”?

一些进一步的背景:我的一些程序(主要用 C 编写)通过串行端口与外部硬件通信。为了测试,我还编写了一个简单的服务器,它创建了一个 PTY,它是我的其他程序可以连接到的对应 TTY,就好像它是一个串行端口一样。虽然在基本层面上,所有这些都运行良好,但目前根本没有真正实现对错误或其他异常情况的处理,这有时会导致非常讨厌的行为。这需要改变!

我特别感兴趣的一种异常情况是连接是否已断开。例如,当一个端口消失时,我们会很高兴地注意到,例如,因为用户拔出了一个 USB 到串行适配器。正确处理读取和写入错误似乎可以避免最严重的意外副作用,但我想知道是否还有更多(观察errorfds,或者可能是其他一些信号)我应该做的事情。不幸的是,UNIX 信号处理是我完全不熟悉的。

4

1 回答 1

1

我知道文件描述符上发生了一些“异常情况”,但一般来说,我怎样才能找出究竟是什么原因造成的呢?是否有一些我应该注意的“神奇”ioctl?

您应该尝试读取 0 个字节。在 linux 中,至少,man 2 read状态:

如果 count 为零,read() 可能会检测到下面描述的错误。

所以,read(fd, NULL,0)你应该有一个errno告诉你更多东西的东西,而不必实际阅读任何东西。手册页中的 weasel 单词may意味着这可能不是很便携,但是(cf read(fd, NULL, 0); 它是做什么的?它是明确定义的吗?

于 2015-01-10T21:39:26.297 回答