ctrl+c输入问题?

在实现SYS_RT_PROCMASK的时候遇到了下面的问题:

测试程序的内容就是先将设置屏蔽SIG_INT信号,然后恢复原先的屏蔽字设置。
下面对应两个结果,分别是对应在设置屏蔽和恢复屏蔽这两个事件之间输入了ctrl+c和没输入ctrl+c的结果:

要是没先输入ctrl+c的话,等到恢复屏蔽的时候可以退出程序

要是先输入ctrl+c的话,屏蔽的时间内输入ctrl+c不会使进程终止(这个是预期行为),等到恢复屏蔽的时候输入ctrl+c就不能退出程序了,只能让程序自行终止

猜测一个进程只能接收一次ctrl+c?一旦输入ctrl+c某个接受输入的东西挂了?

1 个赞

可以测试一下这个pr还能不能复现:

可以把分支跟测试程序发一下,我debug一下看看

没有,好像可以了,我昨天测试的时候以为pr已经合到主线了 :joy:

但是好像还有另一个问题,如果ctrl+C输入次数很多的话发生了奇怪的错误

分支为patch-sigprocmask
测试程序如下

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void signal_handler(int signo) {
    if (signo == SIGINT) {
        printf("\nReceived SIGINT (Ctrl+C)\n");
    }
}

void print_signal_mask(const char *msg, const sigset_t *mask) {
    printf("%s: ", msg);
    for (int signo = 1; signo < NSIG; ++signo) {
        if (sigismember(mask, signo)) {
            printf("%d ", signo);
        }
    }
    printf("\n");
}

int main() {
    sigset_t new_mask, old_mask;
    sigemptyset(&old_mask);

    // 注册 SIGINT 的信号处理函数
    if (signal(SIGINT, signal_handler) == SIG_ERR) {
        perror("signal");
        exit(EXIT_FAILURE);
    }

    // 初始化新的信号集,并将 SIGINT 添加到其中
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);

    // 打印 new_mask 的值
    print_signal_mask("new_mask", &new_mask);

    // 屏蔽 SIGINT
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) < 0) {
        perror("sigprocmask - SIG_BLOCK");
        exit(EXIT_FAILURE);
    }

    // 打印 old_mask 的值
    print_signal_mask("old_mask", &old_mask);

    printf("SIGINT is now blocked. Try pressing Ctrl+C...\n");

    // 等待 5 秒,以便测试 SIGINT 是否被屏蔽
    sleep(5);
    printf("\nIf you pressed Ctrl+C, SIGINT was blocked, and no message should have appeared.\n");

    // 恢复原来的信号屏蔽字
    if (sigprocmask(SIG_SETMASK, &old_mask, NULL) < 0) {
        perror("sigprocmask - SIG_SETMASK");
        exit(EXIT_FAILURE);
    }
    printf("SIGINT is now unblocked. Try pressing Ctrl+C again...\n");

    // 等待 5 秒,以便测试 SIGINT 是否解除屏蔽
    sleep(5);

    printf("Exiting program.\n");
    return 0;
}

我怀疑是哪里死锁导致爆栈了。但是暂时没有进一步的想法。