我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)
CURR_CHILD 通过分叉设置:
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
// ...
}
Run Code Online (Sandbox Code Playgroud)
它似乎成功地停止了子进程,但它不会触发父进程waitpid.当我使用这个kill功能时,我会想到会向父母发送一个信号,但似乎不是因为我的"shell"卡在那条waitpid线上.
我如何做到这一点,一旦Ctrl-Z按下,运行exec命令的进程(在那一点上是一个孩子)应该放在后台(停止),然后父进程应该恢复它对流的控制该计划?