亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 關(guān)于setjmp和longjmp函數(shù)結(jié)果 [打印本頁(yè)]

作者: bin_linux96    時(shí)間: 2011-09-16 15:39
標(biāo)題: 關(guān)于setjmp和longjmp函數(shù)結(jié)果
給位幫忙看下,為什么輸出結(jié)果是這樣,按道理來(lái)說(shuō)應(yīng)該不會(huì)掛掉啊:
hello world
the value = 1
Dbg->the is signal_handler function
hello world
the value = 1
Segmentation fault





#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
#include<signal.h>

void test_function()
{
    int *p =NULL ;
    *p = 0 ;

}


jmp_buf gJmpBuf ;

void signal_handler(int num)
{

    printf("Dbg->the is signal_handler function\n");
    longjmp(gJmpBuf,0);
}

int main()
{

    int a = 1 ;

    setjmp(gJmpBuf);
    printf("hello world \n");
    signal(SIGSEGV,signal_handler) ;

    printf("the value = %d \n",a) ;
    test_function() ;
    printf("the value  ++ =  %d \n",a++) ;

    return  0 ;
}
作者: MMMIX    時(shí)間: 2011-09-16 17:49
回復(fù) 1# bin_linux96


    既然是在 signal handler 里面,就不要用 longjmp() 了,用 siglongjmp() 吧。
作者: bin_linux96    時(shí)間: 2011-09-16 18:02
回復(fù) 2# MMMIX


    我想讓程序一遇到段錯(cuò)誤就執(zhí)行 信號(hào)處理函數(shù),可是signal hander 為什么只運(yùn)行了一次??但第二次發(fā)生段錯(cuò)誤時(shí),程序直接掛掉了...
作者: nova_xmu    時(shí)間: 2011-09-18 00:12
第一次調(diào)用handler的時(shí)候 The SEGV signal is blocked  ,你即使jump出來(lái)但還是處于阻塞的狀態(tài),再調(diào)用的時(shí)候就崩潰了
作者: MMMIX    時(shí)間: 2011-09-18 14:54
回復(fù) 1# bin_linux96


    我寫的一個(gè):

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <signal.h>
  5. #include <setjmp.h>

  6. sigjmp_buf main_env;
  7. int trigger_cnt = 1;
  8. int segv_cnt = 1;

  9. void
  10. segv_trigger(void)
  11. {
  12.         printf("SIGSEGV tigger %d.\n", trigger_cnt++);
  13.         int *p = NULL;
  14.         *p = 0;
  15. }

  16. void
  17. segv_handler(int signum)
  18. {
  19.         assert(signum == SIGSEGV);
  20.         printf("SIGSEGV has been catched %d times.\n", segv_cnt++);
  21.         siglongjmp(main_env, 1);
  22. }

  23. int
  24. main(void)
  25. {
  26.         struct sigaction segv_act;
  27.         volatile int longjmp_cnt;

  28.         segv_act.sa_handler = segv_handler;
  29.         sigemptyset(&segv_act.sa_mask);
  30.         segv_act.sa_flags = 0;
  31.         if (sigaction(SIGSEGV, &segv_act, 0) < 0) {
  32.                 perror("sigaction");
  33.                 exit(EXIT_FAILURE);
  34.         }

  35.         longjmp_cnt = 1;

  36.         if (sigsetjmp(main_env, 1) != 0) {
  37.                 printf("Long jump %d.\n", longjmp_cnt++);
  38.                 if (longjmp_cnt > 3)
  39.                         exit(EXIT_SUCCESS);
  40.         }

  41.         segv_trigger();

  42.         /* UNREACHABLE */
  43.         exit(EXIT_SUCCESS);
  44. }
復(fù)制代碼

作者: sinoman    時(shí)間: 2011-09-21 11:07
請(qǐng)用sigsetjmp, siglongjmp
sigsetjmp根據(jù)返回值做處理
作者: embeddedlwp    時(shí)間: 2012-01-02 18:32
本帖最后由 embeddedlwp 于 2012-01-02 18:42 編輯

回復(fù) 1# bin_linux96


    我在redhat 9 linux 2.4.20-8上運(yùn)行這個(gè)程序沒(méi)有問(wèn)題啊。

    《APUE》說(shuō)調(diào)用longjmp有一個(gè)問(wèn)題,當(dāng)捕捉到一個(gè)信號(hào)時(shí),進(jìn)入信號(hào)捕捉函數(shù),此時(shí)當(dāng)前信號(hào)被自動(dòng)的加到進(jìn)程的信號(hào)屏蔽字中。這阻止了后來(lái)產(chǎn)生的這種信號(hào)中斷該信號(hào)處理程序。在FreeBSD 5.2.1和Mac OS X 10.3中,setjmp和longjmp保存和恢復(fù)信號(hào)屏蔽字。但是,Linux 2.4.22和Solaris 9并不執(zhí)行這種操作。

    不知是不是上邊這個(gè)原因。

   但是我在redhat 9 linux 2.4.20-8系統(tǒng)上,在信號(hào)處理程序中使用setjmp,longjmp沒(méi)有出現(xiàn)什么錯(cuò)誤,跟使用sigsetjmp,longjmp一樣。  
   
   不解!求MMMIX版主指點(diǎn)!
作者: MMMIX    時(shí)間: 2012-01-02 19:25
embeddedlwp 發(fā)表于 2012-01-02 18:32
回復(fù) 1# bin_linux96

 但是我在redhat 9 linux 2.4.20-8系統(tǒng)上,在信號(hào)處理程序中使用setjmp,longjmp沒(méi)有出現(xiàn)什么錯(cuò)誤,跟使用sigsetjmp,longjmp一樣。  


之所以要引入 sigsetjmp/siglongjmp,就是因?yàn)?setjmp/longjmp 在處理 signal mask 的時(shí)候在不同系統(tǒng)上行為不一致,可現(xiàn)在明明有了 sigsetjmp/siglongjmp 你非要在 signal handler 中用 setjmp/longjmp,這不是給自己找麻煩麼?




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2