使用 `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
选项。
或者,您可以将 ptrace
与 PTRACE_TRACEME
选项一起使用,这样即使 WUNTRACED
选项未在 [=] 中指定,它也会为子进程提供状态13=]打电话。
我正在使用 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
选项。
或者,您可以将 ptrace
与 PTRACE_TRACEME
选项一起使用,这样即使 WUNTRACED
选项未在 [=] 中指定,它也会为子进程提供状态13=]打电话。