gpt4 book ai didi

c - UNIX 信号处理。在 SIGCHLD 处理程序中等待。 C

转载 作者:行者123 更新时间:2023-12-02 09:08:34 24 4
gpt4 key购买 nike

我有一个父进程和一个子进程。在父级中,我为 SIGCHLD 建立了一个信号处理程序。我向子进程发送 SIGTSTP 信号,该信号触发 SIGCHLD,并且在父进程的 SIGCHLD siganl 处理程序中,我调用 wait 函数来获取已停止子进程的状态。但它不会立即返回,而是会阻塞。然后,我向子进程发送 SIGCONT 信号,并等待返回,并将 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() 应该立即返回,并且您的宏 WIFSTOPPED(&statol) 应该为 true。

关于c - UNIX 信号处理。在 SIGCHLD 处理程序中等待。 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55147657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com