使用`kill`触发父母的“ waitpid”

时间:2019-02-06 02:26:58

标签: c shell posix

我正在使用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是通过分支设置的:

    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命令(此时为孩子)的进程置于后台(停止),然后父进程应该重新获得对程序流的控制权?

1 个答案:

答案 0 :(得分:3)

printf不是async-signal-safe函数(因为它不是可重入的),因此不能在信号处理程序中使用。使用此类功能将导致不确定的行为。

如果要返回未用ptrace跟踪的子进程,则在使用waitpid时必须指定WUNTRACED选项。

或者,您可以将ptracePTRACE_TRACEME选项一起使用,即使在{{1}中未指定WUNTRACED选项,它也将为子进程提供状态。 }。