UNIX 信号处理。在 SIGCHLD 处理程序中等待。 C
UNIX signal handling. Wait in SIGCHLD handler. C
我有一个 parent 和一个 child 进程。在 parent 中,我为 SIGCHLD 建立了一个信号处理程序。我将 SIGTSTP 信号发送到 child,触发 SIGCHLD,在 parent 的 SIGCHLD 信号处理程序中,我调用等待函数来获取已停止 child 的状态。但是它不会立即返回,而是会阻塞。然后我将 SIGCONT 信号发送到 child 并等待 returns 并将 errno 设置为 Interuppted 系统调用。我不明白我错过了什么。
pid_t pid;
static void sig_chld(int signo);
int main() {
struct sigaction act, savechld;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = sig_chld;
if (sigaction(SIGCHLD, &act, &savechld) < 0){
return errno;
}
pid = fork();
switch (pid){
case -1:{
perror("fork failed");
return errno;
}
case 0:{ //child
if (sigaction(SIGCHLD, &savechld, NULL) < 0)
return errno;
execlp(path, name_of_executable, (char*)NULL);
return errno;
}
default:{
for (;;)
pause();
}
}
return 0;
}
void sig_chld(int signo) {
int statol;
if (wait(&statol) < 0){
perror("waitt error");
exit(errno);
}
if (WIFSTOPPED(statol)){
puts("Child is stopped");
} else if (WIFEXITED(statol)){
puts("Child exited");
} else if (WIFCONTINUED(statol)){
puts("Child continued");
} else if (WIFSIGNALED(statol)){
puts("Child is signaled");
int sig = WTERMSIG(statol);
psignal(sig, NULL);
}
}
您必须使用 waitpid()
而不是 wait()
,并且您需要指定选项 WUNTRACED
以停止使用 waitpid()
报告的子项,如下所示:
if (waitpid(-1, &statol, WUNTRACED) < 0) {
现在 waitpid()
应该立即 return 并且你的宏 WIFSTOPPED(&statol)
应该是真的。
我有一个 parent 和一个 child 进程。在 parent 中,我为 SIGCHLD 建立了一个信号处理程序。我将 SIGTSTP 信号发送到 child,触发 SIGCHLD,在 parent 的 SIGCHLD 信号处理程序中,我调用等待函数来获取已停止 child 的状态。但是它不会立即返回,而是会阻塞。然后我将 SIGCONT 信号发送到 child 并等待 returns 并将 errno 设置为 Interuppted 系统调用。我不明白我错过了什么。
pid_t pid;
static void sig_chld(int signo);
int main() {
struct sigaction act, savechld;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = sig_chld;
if (sigaction(SIGCHLD, &act, &savechld) < 0){
return errno;
}
pid = fork();
switch (pid){
case -1:{
perror("fork failed");
return errno;
}
case 0:{ //child
if (sigaction(SIGCHLD, &savechld, NULL) < 0)
return errno;
execlp(path, name_of_executable, (char*)NULL);
return errno;
}
default:{
for (;;)
pause();
}
}
return 0;
}
void sig_chld(int signo) {
int statol;
if (wait(&statol) < 0){
perror("waitt error");
exit(errno);
}
if (WIFSTOPPED(statol)){
puts("Child is stopped");
} else if (WIFEXITED(statol)){
puts("Child exited");
} else if (WIFCONTINUED(statol)){
puts("Child continued");
} else if (WIFSIGNALED(statol)){
puts("Child is signaled");
int sig = WTERMSIG(statol);
psignal(sig, NULL);
}
}
您必须使用 waitpid()
而不是 wait()
,并且您需要指定选项 WUNTRACED
以停止使用 waitpid()
报告的子项,如下所示:
if (waitpid(-1, &statol, WUNTRACED) < 0) {
现在 waitpid()
应该立即 return 并且你的宏 WIFSTOPPED(&statol)
应该是真的。