sig.sa_sigaction = sig_habdler; sig.sa_flags = SA_SIGINFO; if(-1 == sigaction(num,&sig,NULL)) { perror(""); exit(-1); }每一句话都是什么意思
时间: 2024-06-04 08:09:48 浏览: 140
这段代码是用来注册信号处理函数的,具体解释如下:
1. `sig.sa_sigaction = sig_habdler;`:将 `sig_habdler` 函数设置为信号处理函数,即当收到指定信号时,会执行 `sig_habdler` 函数。
2. `sig.sa_flags = SA_SIGINFO;`:设置 `SA_SIGINFO` 标志,表示在执行信号处理函数时,将传递额外的信息给信号处理函数。
3. `if(-1 == sigaction(num,&sig,NULL)) {perror("");exit(-1);}`:注册信号处理函数。其中,`num` 是指定的信号编号,`&sig` 是指向 `struct sigaction` 结构体的指针,`NULL` 表示不需要保存旧的信号处理函数。如果注册失败,会输出错误信息并退出程序。
相关问题
void dump_backtrace() { void* buffer[200]; int size = backtrace(buffer, sizeof(buffer)); printf("\nbacktrace() returned %d addresses\n", size); char ** info = backtrace_symbols(buffer, size); for (int i=0; i<size; ++i) fprintf(stderr, "[%02d] %s\n", i, info[i]); free(info); exit(0); } void dump_library_maps() { printf("dynamic library maps:\n"); char maps[128] = {0x00}; snprintf(maps, sizeof(maps), "cat /proc/%d/maps", getpid()); system(maps); } void signal_handler(int signo, siginfo_t *info, void *ucontext) { printf("\n=========>>>catch signal %d <<<=========\n", signo); printf("trigger address: %p\n\n", info->si_addr); printf("************* backtrace ******************\n"); dump_library_maps(); printf("\n"); dump_backtrace(); printf("***************backtrace end********************\n"); //signal(signo, SIG_DFL); //恢复默认处理 raise(signo); //再发一次信号 } void watch_signal() { //signal(SIGSEGV, signal_handler); struct sigaction act; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO | SA_RESETHAND; act.sa_sigaction = signal_handler; sigaction(SIGSEGV, &act, NULL); }
这段代码实现了一个信号处理函数signal_handler,当程序发生段错误信号SIGSEGV时,会调用该函数。signal_handler函数会打印出触发信号的地址,以及通过backtrace函数获取的函数调用栈信息。同时,还会通过system函数执行cat /proc/%d/maps命令,打印出当前进程的动态库加载信息。最后,函数会再次调用raise函数,重新触发SIGSEGV信号,使程序立即退出。watch_signal函数则是用来注册SIGSEGV信号的处理函数。
struct sigaction
struct sigaction 是一个用于设置和处理信号的结构体。它定义在 <signal.h> 头文件中。
这个结构体包含了以下成员:
1. `void (*sa_handler)(int)`:指定信号处理函数的地址,即当接收到信号时要执行的操作。可以设置为自定义的函数或者系统提供的默认信号处理函数(例如 SIG_DFL 或 SIG_IGN)。
2. `void (*sa_sigaction)(int, siginfo_t *, void *)`:指定一个用于处理信号的扩展函数的地址。
3. `sigset_t sa_mask`:定义一个在信号处理函数执行期间要阻塞的信号集。这些被阻塞的信号在信号处理函数执行期间不会被送达。
4. `int sa_flags`:指定一些标志来修改信号处理的行为。常见的标志有 SA_RESTART(使被信号中断的系统调用重新启动)和 SA_SIGINFO(使用 sa_sigaction 成员指定的扩展信号处理函数)。
5. `void (*sa_restorer)(void)`:已不再使用。
使用 struct sigaction,我们可以注册信号处理函数、指定需要阻塞的信号以及设置其他处理信号的行为。
阅读全文