c - 使用 SING_DFL 时未恢复 SIGINT 默认行为
问题描述
我正在尝试实现在 ctrl+d(而不是 ctrl+C)上退出的自己的 shell 要做到这一点,我希望我的程序忽略 SIGINT 所以我使用
signal(SIGINT, SIG_IGN);
但我确实希望我在 shell 中运行的程序在 ctrl+c 上退出,所以在每个 fork() 之后,在子进程中,我试图使用恢复默认行为
signal(SIGINT, SIG_DFL);
但不幸的是 SIGING 仍然被忽略。我错过了什么?谢谢你!
编辑:正如评论中提到的问题是 SIGINT 没有到达子进程。如果我理解正确,这是因为 exec 只会重置捕获信号的处理程序,而在我的情况下,我忽略了 sigint。为了解决这个问题,我用我自己的处理程序替换了信号(SIGINT,SIG_IGN),它什么都不做:
void sigint_signal_handler(int signum) {
printf("testttttt");
}
int register_signal_handling() {
struct sigaction sigint_action;
memset(&sigint_action, 0, sizeof(sigint_action));
sigint_action.sa_handler = sigint_signal_handler;
return sigaction(SIGINT, &sigint_action, NULL);
}
int main(void) {
if (register_signal_handling() == -1) {
perror("signal handler registration error");
exit(1);
}
return 0;
}
现在发生的事情很奇怪 - 当我执行 ctrl+c 时,我看到打印了“testttttt”,但它仍然退出程序。如果更换处理程序,这怎么可能?谢谢
解决方案
推荐阅读
- .net-core - 尽管已安装,但我的 VS2017 安装中缺少 .net core 2.2
- python - 警告 - 此实例的状态已在外部设置为成功。服用毒丸
- javascript - 如何在不重新加载的情况下使用 [routerLink] 和 target="_blank" 导航到内部页面?
- visual-studio - IDE 主题的通用样式编辑器
- python - 如何正确处理 Python 中的浮点运算?
- r - 使用 Kable 将带有包装文本的列名称居中
- android - 蓝牙 setPin Android 9 Pie 不再工作
- spring - 如何使用hibernate + spring + java从Java类型中获取任何商店的SQL类型?
- python-2.7 - 为什么我运行某些代码时 Dask 仪表板不更新?
- kotlin - 查找网格中的所有行,即使您必须在网格中向下滚动