【发布时间】:2019-06-29 22:40:54
【问题描述】:
我正在使用sigaction(SIGTSTP, &ctrlz_signal, NULL); 来确保我可以捕捉到Ctrl-Z。
void ctrlz_signal(int sigNo) {
printf("Caught Ctrl-Z | curr_chld=%d\n", CURR_CHILD);
if(CURR_CHILD != 0) kill(CURR_CHILD, SIGTSTP);
}
CURR_CHILD是通过forking设置的:
sigaction(SIGTSTP, &ctrlz_signal, NULL);
int status;
CURR_CHILD = fork();
if (CURR_CHILD < 0) {
// ...
} else if (CURR_CHILD == 0) { // child
// exec(...)
} else { // back in parent
waitpid(CURR_CHILD, &status, 0); // wait for child to finish
// ...
}
它似乎成功地停止了子进程,但它并没有触发父进程的waitpid。当我使用这个kill 函数时,我原以为会有一个信号发送给父级,但似乎不是因为我的“shell”卡在waitpid 行上。
我该如何做到这一点,一旦按下Ctrl-Z,运行exec 命令的进程(此时是一个子进程)应该被置于后台(停止),然后是父进程进程应该重新获得对程序流程的控制权?
【问题讨论】:
-
在信号处理程序中使用
printf()是未定义的,顺便说一句。您应该再次阅读waitpid()的手册页,注意有关 options 参数的部分。 -
@Shawn 你帮了我,谢谢!随意张贴
WUNTRACED是我在waitpid中需要的标志,我会将其标记为答案。 :)