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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3941 | 回復: 7
打印 上一主題 下一主題

關于setjmp和longjmp函數(shù)結(jié)果 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-09-16 15:39 |只看該作者 |倒序瀏覽
給位幫忙看下,為什么輸出結(jié)果是這樣,按道理來說應該不會掛掉。
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 ;
}

論壇徽章:
95
程序設計版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設計版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設計版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
2 [報告]
發(fā)表于 2011-09-16 17:49 |只看該作者
回復 1# bin_linux96


    既然是在 signal handler 里面,就不要用 longjmp() 了,用 siglongjmp() 吧。

論壇徽章:
0
3 [報告]
發(fā)表于 2011-09-16 18:02 |只看該作者
回復 2# MMMIX


    我想讓程序一遇到段錯誤就執(zhí)行 信號處理函數(shù),可是signal hander 為什么只運行了一次??但第二次發(fā)生段錯誤時,程序直接掛掉了...

論壇徽章:
0
4 [報告]
發(fā)表于 2011-09-18 00:12 |只看該作者
第一次調(diào)用handler的時候 The SEGV signal is blocked  ,你即使jump出來但還是處于阻塞的狀態(tài),再調(diào)用的時候就崩潰了

論壇徽章:
95
程序設計版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設計版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設計版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
5 [報告]
發(fā)表于 2011-09-18 14:54 |只看該作者
回復 1# bin_linux96


    我寫的一個:

  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. }
復制代碼

論壇徽章:
0
6 [報告]
發(fā)表于 2011-09-21 11:07 |只看該作者
請用sigsetjmp, siglongjmp
sigsetjmp根據(jù)返回值做處理

論壇徽章:
16
2015亞冠之吉達阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉雞
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52雙魚座
日期:2014-02-22 13:07:56午馬
日期:2014-02-14 11:08:18雙魚座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
7 [報告]
發(fā)表于 2012-01-02 18:32 |只看該作者
本帖最后由 embeddedlwp 于 2012-01-02 18:42 編輯

回復 1# bin_linux96


    我在redhat 9 linux 2.4.20-8上運行這個程序沒有問題啊。

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

    不知是不是上邊這個原因。

   但是我在redhat 9 linux 2.4.20-8系統(tǒng)上,在信號處理程序中使用setjmp,longjmp沒有出現(xiàn)什么錯誤,跟使用sigsetjmp,longjmp一樣。  
   
   不解!求MMMIX版主指點!

論壇徽章:
95
程序設計版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設計版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設計版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
8 [報告]
發(fā)表于 2012-01-02 19:25 |只看該作者
embeddedlwp 發(fā)表于 2012-01-02 18:32
回復 1# bin_linux96

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


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

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP