我的系統是Ubuntu 12.04。 我修改了man 2 signalfd
的示例,並在示例中添加了sigaddset(&mask, SIGSEGV)
。但是當生成SIGSEGV
時,我無法獲得輸出。爲什麼無法使用signalfd捕獲SIGSEGV?
這是一個缺陷glibc
?的源代碼的片段下列:
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGQUIT);
sigaddset(&mask, SIGSEGV);
/* Block signals so that they aren't handled
according to their default dispositions */
if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
handle_error("sigprocmask");
sfd = signalfd(-1, &mask, 0);
if (sfd == -1)
handle_error("signalfd");
int* a = NULL;
for (;;) {
s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo));
if (s != sizeof(struct signalfd_siginfo))
handle_error("read");
if (fdsi.ssi_signo == SIGINT) {
printf("Got SIGINT\n");
(*a) = 1;
} else if (fdsi.ssi_signo == SIGQUIT) {
printf("Got SIGQUIT\n");
exit(EXIT_SUCCESS);
} else {
printf("Read unexpected signal\n");
}
}
請解釋你爲什麼要抓住'SIGSEGV' .... –
我只是想測試是否可以異步處理「SIGSEGV」並輸出堆棧回溯信息。因爲有許多「不安全的功能」在信號處理程序中不能使用。 –
正如我在答覆中所說的,爲了回溯目的,您可以使用SIGSEGV處理程序中的不安全函數。這通常運作良好(但可能會失敗或崩潰) –