[問題] signal 與 使用 SIGSEGV 的問題

看板LinuxDev作者 (哈)時間17年前 (2008/06/20 00:14), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
我主要是使用signal 的sigaction, 在設定去抓取SIGSEGV這個訊號讓handler處理相關動作時, 為何產生無限迴圈,導致output不停地印出"SIGSEGV !" ? 正常來說,不是跑完handler後就會跳回原來的執行位置上嗎? 另外,我的情形不太適合用 longjmp 跟 setjmp ... ps: 我只有使用 SIGSEGV 時才會發生無限迴圈的情形 以下是我寫的範例程式,請各位參考看看: #include <stdio.h> #include <signal.h> #include <sys/mman.h> typedef struct my_vm{ char *ptr; }myvm; void segv_handler (int signum, siginfo_t *si, void *ctx) { printf("SIGSEGV !\n"); sleep(1); } int main (int argc, char *argv[]) { myvm vm , *pvm; struct sigaction sa; sa.sa_handler = SIG_DFL; sa.sa_sigaction = segv_handler; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); if (sigaction(SIGSEGV, &sa, NULL) < 0) //SIGSEGV:讀寫到非法記憶體位置 printf(" Error assigning signal!\n"); pvm = &vm; pvm->ptr = (char *)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); if(mprotect(pvm->ptr, 4096, PROT_READ)) perror("mprotect error"); vm.ptr[407] = 2; //觸發handler printf("vm.ptr = %p\n",vm.ptr[407]); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.129.29 ※ 編輯: linsung 來自: 140.113.129.29 (06/20 00:14) =============== 後來搞定了 原來是要在 segv_handler 更改其 ptr 的權限為可讀寫 這樣就不會重複違反只能讀的權限而導致不停地跳至 handler void segv_handler (int signum, siginfo_t *si, void *ctx) { mprotect(pvm->ptr, 4096, PROT_READ | PROT_WRITE); printf("SIGSEGV !: fault = %u\n", si->si_addr); sleep(1); } ps: 並把 pvm 改為全域變數 ※ 編輯: linsung 來自: 140.113.129.29 (07/06 03:24)
文章代碼(AID): #18MeNfl0 (LinuxDev)
文章代碼(AID): #18MeNfl0 (LinuxDev)