藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 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不提供這些保護措施的話,對於一個編程語言來說,要做的工作要多的多。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com