小编Sha*_*hay的帖子

信号处理程序无限循环:为什么?

编辑:
\n我在第一次接触 signal.h 后就匆忙地写了这样的内容,所以我最初的问题有点到处都是,并且被很多更混乱的部分所困扰,这可能会让它变得更烦人/更困难回答。我似乎还误解了信号 \xe2\x80\x93 的“屏蔽”部分,我似乎认为屏蔽意味着信号将被丢弃,但实际上,我认为发生的情况是处理程序是\没有被触发,但信号传输并“保持”(重复的信号被合并),直到从处理程序返回。
\n在这里重新措辞以突出显示我原始问题中仍然让我困惑的部分(原始问题仍然在下面,以免在没有明确上下文的情况下留下现有评论等):

\n

据我所知,信号处理程序是在内核模式到用户模式转换时触发的。引用:
\n男人7号信号摘录
\n(万一图像损坏,无论出于何种原因\xe2\x80\x93,它引自man 7 signal:“每当从内核模式转换到用户模式执行时[...]内核检查是否有一个待处理的未阻塞信号,进程已为其建立了信号处理程序。”)

\n

我写下了下面的代码:

\n
const char* ON_SIGTSTP_ENTRY = "Got SIGTSTP.\\n";\nconst char* ON_SIGTSTP_EXIT = "Exiting SIGTSTP handler.\\n";\nconst char* ON_SIGINT_ENTRY = "Got SIGINT.\\n";\nconst char* ON_SIGINT_EXIT = "Exiting SIGINT handler.\\n";\n\nvoid ctrlZHandler(int sig_num) {\n    write(1, ON_SIGTSTP_ENTRY, strlen(ON_SIGTSTP_ENTRY));\n    kill(getpid(), SIGINT);\n    write(1, ON_SIGTSTP_EXIT, strlen(ON_SIGTSTP_EXIT));\n}\n\nvoid ctrlCHandler(int sig_num) {\n    write(1, ON_SIGINT_ENTRY, strlen(ON_SIGINT_ENTRY));\n    kill(getpid(), SIGTSTP);\n    write(1, ON_SIGINT_EXIT, strlen(ON_SIGINT_EXIT));\n}\n\nint main() {\n    if(signal(SIGTSTP, ctrlZHandler) == SIG_ERR) {\n        cout << "Failed to set SIGTSTP handler." << …
Run Code Online (Sandbox Code Playgroud)

c ubuntu signals windows-subsystem-for-linux

2
推荐指数
1
解决办法
193
查看次数

标签 统计

c ×1

signals ×1

ubuntu ×1

windows-subsystem-for-linux ×1