[問題] signal 與 使用 SIGSEGV 的問題
我主要是使用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)
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章