【问题标题】:How to use a signal handler in Unix?如何在 Unix 中使用信号处理程序?
【发布时间】:2020-03-31 01:15:08
【问题描述】:

我正在学习信号。在以下代码中,如何在输入 CTRL-C 信号后在 while 循环内继续打印提示。还有如何用 CTRL-D 信号终止进程。

int main(int argc, char *argv[]){  

    struct sigaction sh;
    sh.sa_handler = sigint_handler;
    sigemptyset(&sh.sa_mask);
    sh.sa_flags = 0;
    sigaction(SIGINT, &sh, NULL);

    while(1)
    {
        printf("Some prompt: ");
    }
    return 0;
}

【问题讨论】:

标签: c unix signals


【解决方案1】:

如何在 unix 中使用信号处理器?

阅读signal(7),最重要的是signal-safety(7)。适当地使用fflush(3),因为stdio(3) 被缓冲了。

还有如何使用 CTRL-D 信号终止进程。

但是 Ctrl D 不是一个信号。见stty(1)。当stdin 是终端时,它会触发文件结束条件。请参阅isatty(3)pty(7)。要检测文件结束的情况,请参阅read(2)feof(3)

另请参阅this 答案。

您可能有兴趣使用readline(3)

你应该读一本好书,比如Advanced Linux Programming(它很好地解释了信号)然后syscalls(2)

Linux 有signalfd(2),对event loops 更友好,因为它可以与poll(2) 等多路复用系统调用一起使用。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2017-05-06
    • 2016-03-31
    • 2019-08-04
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多