gpt4 book ai didi

无法为 SIGTRAP 注册处理程序

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:17 25 4
gpt4 key购买 nike

我正在尝试为 SIGTRAP 注册处理程序,该处理程序由在子级中调用 int3 引起,但它不起作用。将 SIGTRAP 更改为 SIGCHLD 即可。

#include <signal.h>
#include <wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>


void child();
void parent(pid_t pid);
void sigtrap_handler(int sig);

int main(){
pid_t pid = fork();
if(pid == 0){
child();
} else {
parent(pid);
}
}


void child(){
sleep(1);
asm("int3");
exit(EXIT_SUCCESS);
}

void parent(pid_t pid){
signal(SIGTRAP, sigtrap_handler);
int status;
do{
waitpid(pid, &status, WUNTRACED | WCONTINUED);
} while(!WIFEXITED(status) && !WIFSIGNALED(status));
exit(EXIT_SUCCESS);
}

void sigtrap_handler(int sig){
printf("Process %d received sigtrap %d.\n", getpid(), sig);
}

最佳答案

只有父进程为 SIGTRAP 注册了信号处理程序,子进程没有。因此,当您在子进程中引发 SIGTRAP 时,父进程进程并不知道它。

SIGCHLD 有效(即被父进程接收),因为当子进程终止(或停止)时,信号 SIGCHLD 被发送到父进程。但在 SIGTRAP(或任何其他信号)的情况下,它不会发送到父进程。 SIGCHLD 在某种意义上是特殊的,它默认在终止时发送到父进程,而其他信号则不是。

如果您在子进程中添加一个处理程序,您将看到该处理程序被调用:

void child(){
signal(SIGTRAP, sigtrap_handler);
sleep(1);
asm("int3");
exit(EXIT_SUCCESS);
}

顺便说一下,printf() 不是 async-signal-safe函数,因此您不能在信号处理程序中安全地调用它。

关于无法为 SIGTRAP 注册处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34530060/

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