亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

進程環境之setjmp和longjmp函數

2024-06-28 13:28:37
字體:
來源:轉載
供稿:網友
進程環境之setjmp和longjmp函數

在C中,goto語句是不能跨越函數的,而執行這樣跳轉功能的是函數setjmp和longjmp。這兩個函數對于處理發生在深層嵌套函數調用中的出錯情況是非常有用的。

setjmp和longjmp函數也稱為非局部goto,非局部指的是,這不是由普通C語言goto語句在一個函數內實施的跳轉,而是在棧上跳過若干調用幀,返回到當前函數調用路徑上的某一函數中

#include <setjmp.h>int setjmp( jmp_buf env );返回值:若直接調用則返回0,若從longjmp調用返回則返回非0值void longjmp( jmp_buf env, int val );

 

12

圖7-4  調用cmd_add后的各個棧幀(函數調用關系為:main先調用do_line,do_line又調用cmd_add)

在希望返回到的位置調用setjmp,假定此位置在main函數中,因為我們是直接調用該函數,所以其返回值為0。setjmp參數env的類型是一個特殊類型jmp_buf。這一數據類型是某種形式的數組,其中存放:在調用longjmp時能用來恢復棧狀態的所有信息。因為需要在另一個函數中引用env變量,所以規范的處理方式是將env變量定義為全局變量。

當檢查到一個錯誤時,例如在cmd_add函數中,則以兩個參數調用longjmp函數。第一個就是在調用setjmp時所用的env;第二個參數是具有非0值的val,它將成為從setjmp處返回的值。使用第二個參數的原因是對于一個setjmp可以有多個longjmp。例如,可以在cmd_add中以val為1調用longjmp,也可在do_line中以val為2調用longjmp。在setjmp的返回值就會是1或2,通過測試返回值就可以判斷造成返回的longjmp是在cmd_add還是在do_line中。

我們假定在main中調用了setjmp(jmpbuffer),在cmd_add中調用了longjmp(jmpbuffer, 1)為例進行后續說明。

...#include <setjmp.h>...jmp_buf jmpbuffer;intmain(void){    ...    if( setjmp(jmpbuffer) != 0 )        PRintf("error");    ...}...void cmd_add(void){    ...    if( ... )     /* an error has occurred */        longjmp( jmpbuffer, 1 );    ...}

執行main時,調用setjmp,它將所需的信息記入變量jmpbuffer中并返回0。然后調用do_line,它又調用cmd_add,假定在其中檢查到一個錯誤。在cmd_add中調用longjmp之前,棧的形式如圖7-4所示。但是longjmp使棧反繞(rewind to)到執行main函數時的情況,也就是拋棄了cmd_add和do_line的棧幀(見圖7-5)。調用longjmp造成main中setjmp的返回,但是,這一次的返回值是1(longjmp的第二個參數)。

28852942_1369291619x1Fm

                   圖7-5 調用longjmp后的棧幀(f1代表do_line、f2代表cmd_add)

1、自動、寄存器和易失變量

調用longjmp時,大多數實現并不回滾自動變量和寄存器變量的值,而所有標準則說它們的值是不確定的。如果你有一個自動變量,而又不想使其值回滾,則可定義其為具有volatile的屬性。聲明為全局或靜態變量的值在執行longjmp時保持不變。

程序清單7-6 longjmp對各類變量的影響

[root@localhost apue]# cat prog7-6.c#include "apue.h"#include <setjmp.h>static void f1(int, int, int, int);static void f2(void);static jmp_buf  jmpbuffer;static int      globval;int main(void){        int             autoval;        register int    regival;        volatile int    volaval;        static   int    statval;        globval = 1;        autoval = 2;        regival = 3;        volaval = 4;        statval = 5;        if(setjmp(jmpbuffer) != 0)        {                printf("after longjmp:/n");                printf("globval = %d, autoval = %d, regival = %d,"                       "volaval = %d, statval = %d/n",                     /* ISO C的字符串連接功能 */                        globval, autoval, regival, volaval, statval);                exit(0);        }        /*        * Change variables after setjmp, but before longjmp.        */        globval = 95;        autoval = 96;        regival = 97;        volaval = 98;        statval = 99;        f1(autoval, regival, volaval, statval); /* never returns */        exit(0);}static voidf1(int i, int j, int k, int l){        printf("in f1():/n");        printf("globval = %d, autoval = %d, regival = %d,"               "volaval = %d, statval = %d/n", globval, i, j, k, l);        f2();}static voidf2(void){        longjmp(jmpbuffer, 1);}

如果以不帶優化和帶優化選項對此程序分別進行編譯,然后運行它們,則得到的結果是不同的:

[root@localhost apue]# cc -o prog7-6 prog7-6.c        不進行任何優化的編譯[root@localhost apue]# ./prog7-6in f1():globval = 95, autoval = 96, regival = 97,volaval = 98, statval = 99after longjmp:globval = 95, autoval = 96, regival = 97,volaval = 98, statval = 99[root@localhost apue]# cc -o prog7-6 -O prog7-6.c        進行全部優化的編譯[root@localhost apue]# ./prog7-6in f1():globval = 95, autoval = 96, regival = 97,volaval = 98, statval = 99after longjmp:globval = 95, autoval = 2, regival = 3,volaval = 98, statval = 99

注意,全局、靜態和易失變量不受優化的影響,在調用longjmp后,它們的值是最近所呈現的值。

某個系統的setjmp(3)手冊頁上說明,存放在存儲器中的變量將具有longjmp時的值,而在CPU和浮點寄存器中的變量則恢復為調用setjmp時的值。

不進行優化時,所有這5個變量都存放在存儲器中(亦即忽略了對regival變量的register存儲類說明)。而進行了優化后,autoval和regival都存放在寄存器中(即使autoval并未聲明為register),volatile變量則仍存放在存儲器中。

通過這一實例我們可以理解到,如果要編寫一個使用非局部跳轉的可移植程序,則必須使用volatile屬性。

2、自動變量的潛在問題

基本規則是聲明自動變量的函數已經返回后,不能再引用這些自動變量。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲性日韩精品一区二区| 久久久亚洲福利精品午夜| 精品偷拍各种wc美女嘘嘘| 午夜精品一区二区三区视频免费看| 国产成人av网| 久热精品视频在线观看一区| 欧美洲成人男女午夜视频| 国产成人鲁鲁免费视频a| 久久电影一区二区| 91精品国产高清| 狠狠躁18三区二区一区| 亚洲最大福利视频| 国产一区二区三区视频免费| 亚洲国产精品久久91精品| 91精品久久久久久久久不口人| 国产区亚洲区欧美区| 2019中文字幕全在线观看| 78m国产成人精品视频| 91在线免费看网站| 亚洲第一综合天堂另类专| 精品成人69xx.xyz| 欧美亚洲第一页| 国产精品久久久久久久久| 亚洲国产日韩欧美在线图片| 亚洲欧美国产高清va在线播| 欧美孕妇毛茸茸xxxx| 日日狠狠久久偷偷四色综合免费| 日本一欧美一欧美一亚洲视频| 亚洲午夜精品久久久久久性色| 欧美成人精品激情在线观看| 日韩毛片在线观看| 欧美另类极品videosbestfree| 91色在线视频| 国内精品国产三级国产在线专| 中文字幕av一区二区三区谷原希美| 91免费在线视频网站| 亚洲综合社区网| 亚洲在线免费视频| 色哟哟亚洲精品一区二区| 这里只有精品在线播放| 色妞色视频一区二区三区四区| 久久精品99久久香蕉国产色戒| 亚洲综合日韩中文字幕v在线| 中日韩午夜理伦电影免费| 最新91在线视频| 欧美成年人网站| 欧美日韩成人免费| 91精品国产综合久久久久久蜜臀| 欧美激情啊啊啊| 91欧美日韩一区| 亚洲男人的天堂网站| 亚洲一区二区久久久久久| 亚洲国产精品99| 欧美成人手机在线| 国产精品999999| 欧美日韩在线视频首页| 国产热re99久久6国产精品| 欧美国产日本在线| 中文字幕一精品亚洲无线一区| 国产精品香蕉国产| 国产精品第1页| 精品久久在线播放| 国外日韩电影在线观看| 亚洲系列中文字幕| 国产在线拍揄自揄视频不卡99| 亚洲日本成人女熟在线观看| 亚洲一区二区三区成人在线视频精品| 日本久久久久久久| 怡红院精品视频| 欧美日本高清视频| 日韩中文在线中文网三级| 色噜噜狠狠狠综合曰曰曰| 国产精品成人观看视频国产奇米| 欧美电影在线播放| 亚洲四色影视在线观看| 色综久久综合桃花网| 亚洲人成电影网站色…| 欧美极度另类性三渗透| 欧美重口另类videos人妖| 欧美国产亚洲视频| 色狠狠久久aa北条麻妃| 久久精品视频在线观看| 亚洲精品av在线播放| 欧美性xxxxxxx| 国产精品一区电影| 97久久精品国产| 国产精品久久久999| 成人激情视频在线播放| 精品小视频在线| 国模私拍一区二区三区| 亚洲色图在线观看| 亚洲国产日韩欧美在线动漫| 日韩av在线天堂网| 91免费版网站入口| 国产精品福利久久久| 91综合免费在线| 中文字幕在线成人| 国产在线精品成人一区二区三区| 日韩欧美一区二区三区久久| 国产精品欧美日韩| 欧美黑人一区二区三区| 日韩经典中文字幕| 66m—66摸成人免费视频| 久久免费精品视频| 亚洲乱码一区av黑人高潮| 亚洲色图25p| 黄色成人av网| 成人午夜在线影院| 97国产精品免费视频| 91久久久久久| 久久人91精品久久久久久不卡| 国产丝袜一区视频在线观看| 国产精品亚洲аv天堂网| 亚洲欧美中文在线视频| 国产69精品久久久久9| 久久精品视频网站| 中文国产成人精品久久一| 日韩av观看网址| 亚洲资源在线看| 亚洲成人三级在线| 国产成人综合精品在线| 国产婷婷色综合av蜜臀av| 国产97人人超碰caoprom| 日韩欧美高清视频| 日本伊人精品一区二区三区介绍| 亚洲色图在线观看| 久久99久久久久久久噜噜| 俺去了亚洲欧美日韩| 国产成人精品视| 欧美丰满少妇xxxx| 奇米四色中文综合久久| 国产精品久久久久久久久免费| 91精品久久久久久久久| 日韩一区二区三区在线播放| 欧美成人免费全部观看天天性色| 亚洲精品成人久久久| 日韩精品在线观看一区二区| 另类色图亚洲色图| 亚洲女人被黑人巨大进入| 毛片精品免费在线观看| 精品magnet| 日韩美女主播视频| 欧美精品在线看| 久久免费视频网| 精品国产拍在线观看| 精品国产欧美成人夜夜嗨| 国产69精品久久久| 亚洲第一区中文99精品| 精品视频一区在线视频| 国产精品视频免费在线观看| 92福利视频午夜1000合集在线观看| 91系列在线观看| 51午夜精品视频| 久久在线免费观看视频| 精品久久中文字幕| 欧美老女人在线视频| 日韩中文字幕在线视频播放| 欧美裸体男粗大视频在线观看| 在线国产精品视频| 欧美日韩午夜激情| 亚洲成人激情视频| 久久国产精品久久国产精品| 亚洲欧洲日韩国产| 久久福利网址导航|