gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:35:42 24 4
gpt4 key购买 nike

我正在制作一个像服务器一样运行的程序,因此它不断运行 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com