|
藍森林 http://www.lslnet.com 2006年6月6日 10:18
如何忽略SIGSEGV?
在linux系統下能夠忽略掉這個信號麼? 我試圖使用SIG_IGN來忽略這個信號,可是發現程序一樣會退出,我又設置handle截取這個信號,雖然可以截取,但是進程會不斷的收到sigsegv信號,請問有沒有什麼辦法徹底的忽略這個信號,替換系統調用? |
如何忽略SIGSEGV?
trap "SIGSEGV" |
如何忽略SIGSEGV?
how to use trap ignore this signal in my C program.
any details
thanks |
如何忽略SIGSEGV?
Redhat Linux 7.2 says:
[code]
According to POSIX, the behaviour of a process is unde-
fined after it ignores a SIGFPE, SIGILL, or SIGSEGV signal
that was not generated by the kill() or the raise() func-
tions. Integer division by zero has undefined result. On
some architectures it will generate a SIGFPE signal.
(Also dividing the most negative integer by -1 may gener-
ate SIGFPE.) Ignoring this signal might lead to an end-
less loop.
[/code]
But under Aix 4.3 and FreeBSD 4.5:
[code]
#include <signal.h>;
int
main(void)
{
int * p;
if (signal(SIGSEGV, SIG_IGN) == SIG_ERR) {
printf("can't catch SIGSEGV");
exit(0);
}
p = 0;
*p = 2;
while (1)
sleep(1);
}
[/code]
The test is ok. |
如何忽略SIGSEGV?
SIGSEGV和_SIGBUS和SIGFPE
有些系統程序可以IGN,但是沒有意義!
如果違例了,繼續運行是可怕的。 |
如何忽略SIGSEGV?
可以忽略,但你不能跳過它.如果將qjlemon兄程序的最後部分
"while (1)
sleep(1); "
改為一個printf語句,你會發現程序在printf語句執行前就死了,為什麼?
因為SIGSEGV是由無效內存引用引起的,由硬件檢測並發給內核,你忽略,它再產生,你再忽略,它再產生...進入死循環了.
不知道你為何會有此想法,竟然想忽略SIGSEGV信號. |
如何忽略SIGSEGV?
對呀, 我也懷疑根本到不了那個while裡。 Linux在遇到這個信號時似乎是」一定」中止程序,看來是有它的道理的。這種錯誤可以看作是無論如何不應該產生的。 |
如何忽略SIGSEGV?
SIGSEGV和_SIGBUS和SIGFPE
這些信號,ign會導致進程阻塞。
如果OS不提供這些保護措施的話,對於一個編程語言來說,要做的工作要多的多。 |
| |