使用 poll() 时正确处理 Ctrl-C

标签 c linux

我正在制作一个像服务器一样运行的程序,因此它不断运行 poll。我需要同时处理 Ctrl-CCtrl-D。虽然 Ctrl-D 在使用 poll 时非常容易使用(您也可以为 poll >POLLIN on stdin),我想不出一个很好的信号解决方案。我是否需要创建一个虚拟文件,我的信号处理程序会在退出时向其写入一些内容,或者管道是否可以很好地满足这个目的?

最佳答案

正如 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)但禁止在信号处理程序中使用 fprintfmalloc仔细阅读 signal(7)signal-safety(7) .

关于使用 poll() 时正确处理 Ctrl-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43555398/

相关文章:

c - SIMD 搜索最后一个峰值后的低谷

c - C 中的地址加法和乘法

java - 从 shell 文件创建批处理文件

linux - 在 Linux 上运行 X-CTU

linux - Docker 容器中的 "Permission denied"除非 --privileged=true

c - 删除文件中一行的更好方法?

C中指针的概念不清楚

c - 有没有一种简单的方法可以从文件中使用 SDL 创建字符串?

linux - 使用正则表达式别名时如何设置devnull后缀用户

linux - 我的自定义 JMeter 监听器无法在 Linux 中工作