在实现SYS_RT_PROCMASK的时候遇到了下面的问题:
测试程序的内容就是先将设置屏蔽SIG_INT信号,然后恢复原先的屏蔽字设置。
下面对应两个结果,分别是对应在设置屏蔽和恢复屏蔽这两个事件之间输入了ctrl+c和没输入ctrl+c的结果:
要是没先输入ctrl+c的话,等到恢复屏蔽的时候可以退出程序
要是先输入ctrl+c的话,屏蔽的时间内输入ctrl+c不会使进程终止(这个是预期行为),等到恢复屏蔽的时候输入ctrl+c就不能退出程序了,只能让程序自行终止
猜测一个进程只能接收一次ctrl+c?一旦输入ctrl+c某个接受输入的东西挂了?
1 个赞
没有,好像可以了,我昨天测试的时候以为pr已经合到主线了
但是好像还有另一个问题,如果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;
}
我怀疑是哪里死锁导致爆栈了。但是暂时没有进一步的想法。