我正在制作一个像服务器一样运行的程序,因此它不断运行 poll
。我需要同时处理 Ctrl-C 和 Ctrl-D。虽然 Ctrl-D 在使用 poll
时非常容易使用(您也可以为
on poll
>POLLINstdin
),我想不出一个很好的信号解决方案。我是否需要创建一个虚拟文件,我的信号处理程序会在退出时向其写入一些内容,或者管道是否可以很好地满足这个目的?
最佳答案
正如 Dietrich Epp 评论的那样, 一个通常的处理方式是“pipe to self”技巧。首先,在初始化 时,您设置了一个 pipe(7) :你会调用pipe(2)并且您将该管道的读写文件描述符保存在某些(例如全局)数据中。您的信号处理程序将只是 write(2)到写端 fd 一些字节(可能是单个 0 字节 ...)。你的事件循环围绕 poll(2) (或较旧的 select(2) 等...)会通过 read(2) 作出 react - 当读端文件描述符有一些数据时读取字节。
这种 self 欺骗的管道对于所有 POSIX 系统都是通用的和可移植的,并且推荐使用,例如by Qt .
signalfd(2)系统调用是特定于 Linux 的(例如,您在 MacOSX 上没有)。一些旧的 Linux 内核可能没有它。
请注意,信号处理程序中可用的函数集仅限于异步信号安全函数 - 因此您可以使用 write(2)但禁止在信号处理程序中使用 fprintf
或 malloc
。 仔细阅读 signal(7)和 signal-safety(7) .
关于使用 poll() 时正确处理 Ctrl-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43555398/