使用`kill`来触发父母的`waitpid`

pay*_*yne 6 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);
}
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命令的进程(在那一点上是一个孩子)应该放在后台(停止),然后父进程应该恢复它对流的控制该计划?

P.W*_*P.W 3

printf不是异步信号安全函数(因为它不可重入),因此不得在信号处理程序中使用。使用此类函数将导致未定义的行为。

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

或者,您可以ptrace与该PTRACE_TRACEME选项一起使用,这样即使WUNTRACED在调用中未指定该选项,它也会提供子进程的状态waitpid