c - 在我退出之前处理 sigaction 时我的打印品没有出现

标签 c unix signals

<分区>

我是 Unix 中信号的新手,这个练习的目的是禁用 SIGINT 来停止程序并使用 SIGQUIT 代替,当我按下 ctrl-c 时它成功地忽略了 SIGINT 但 printf 直到我按下Ctrl-/用于 SIGQUIT,所有消息立即出现。

示例:如果我按 ctrl-c 4 次,然后按 ctrl-/: 仅在按下 ctrl-\后,我收到 4 条消息说我按下了 Ctrl-c,然后退出时您发送了 SIGQUIT 信号。

如果我只按 ctrl-c,我什么也得不到,但至少它被忽略了

struct sigaction action;

void hand(int sig)
{
    switch(sig){
    case SIGINT:
        printf("You have presed ctrl-c");
        break;
    case SIGQUIT:
        printf("Quittin you sent a SIGQUIT signal");
        exit(SIGQUIT);
        break;
    default:
        printf("WRONG SIGNAL");
        exit(-1);
        break;
    }
}

int main()
{       
    action.sa_handler=hand;
    printf("Ctrl-C disabled, press Ctrl-/ to quit...\n");
    sigaction(SIGINT,&action,NULL);
    sigaction(SIGQUIT,&action,NULL);
    while(1){
        sleep(1);
    }
}

最佳答案

这里有两个问题。首先,printf 默认情况下是行缓冲的,您不会打印换行符,因此输出缓冲区可能不会在您期望的时候刷新。其次,printf 函数不是异步信号安全的,这意味着在信号处理程序中调用它是未定义的行为。

更改信号处理程序以设置标志而不是打印,然后在循环中检查该标志并打印(在字符串末尾使用 \n)如果已设置。

关于c - 在我退出之前处理 sigaction 时我的打印品没有出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59308434/

相关文章:

c - 在 libgit2 中使用 SSH 身份验证

Linux/Unix 检查 VPN 连接是否激活/启动

linux - 无法在 golang 中捕获 upstart 发送的 SIGTERM

linux - 在 x86 上发送用户模式中断

c - 求两个非常大的数与一个非常大的数相乘的模

c - 在c中的套接字编程中读取或写入后没有代码运行

c - pthread_mutex_trylock 段错误

regex - 我的 Perl 正则表达式有什么问题

unix - UNIX crontab 中的日期时间格式

c - 什么是 "FPE_FLTSUB: subscript out of range"信号?