使用 `kill` 触发 parent 的 `waitpid`

Using `kill` to trigger a parent's `waitpid`

我正在使用 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
        // ...
    }

它似乎成功地停止了 child 进程,但是它没有触发 parent 的 waitpid。我原以为当我使用这个 kill 函数时会有一个信号发送到 parent,但似乎没有,因为我的 "shell" 卡在了那个上面waitpid行。

我如何做到这一点,一旦按下 Ctrl-Z,进程 运行 一个 exec 命令(此时是一个 child)应该放在后台(停止),然后 parent 进程应该重新获得对程序流的控制?

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

如果你想要一个不被ptrace跟踪到return的子进程,你必须在使用waitpid时指定WUNTRACED选项。

或者,您可以将 ptracePTRACE_TRACEME 选项一起使用,这样即使 WUNTRACED 选项未在 [=] 中指定,它也会为子进程提供状态13=]打电话。