sigsetjmp函數

相關函數:longjmp, siglongjmp, setjmp 
表頭文件:#include <setjmp.h> 
函數定義:int sigsetjmp(sigjmp_buf env, int savesigs) 
函數說明:sigsetjmp()會保存目前堆棧環境,然後將目前的地址作一個記號,
而在程序其他地方調用siglongjmp()時便會直接跳到這個記號位置,然後還原堆棧,繼續程序的執行。 
參數env爲用來保存目前堆棧環境,一般聲明爲全局變量 
參數savesigs若爲非0則代表擱置的信號集合也會一塊保存 
當sigsetjmp()返回0時代表已經做好記號上,若返回非0則代表由siglongjmp()跳轉回來。 

返回:若直接調用則爲0,若從siglongjmp調用返回則爲非0


示例:

#include <stdio.h>  
#include <signal.h>  
#include <setjmp.h>  
#include <unistd.h>  
#include <sys/time.h>  
  
sigjmp_buf jmp_env;  
  
static void connect_alarm(int)  
{  
    siglongjmp(jmp_env, 1);  
}  
  
int main()  
{  
    // 當超時時間sec_timeout大於等於運行時間run_time時會跳過printf("running...\n");  
    int sec_timeout = 3;  
    int run_time = 2;  
  
    printf("timeout = %d, run time = %d\n", sec_timeout, run_time);  
    if (sec_timeout)  
    {  
        // 超過用alarm函數設置的時間時產生此信號,調用connect_alarm函數  
        signal(SIGALRM, connect_alarm);  
        alarm(sec_timeout);  
        printf("set timeout\n");  
        if (sigsetjmp(jmp_env, 1))  
        {  
            printf("timeout\n");  
            goto out;  
        }  
    }  
  
    sleep(run_time);  
    printf("running...\n");  
  
out:  
    if (sec_timeout)  
    {  
        // 取消先前設置的鬧鐘  
        alarm(0);  
        printf("cancel timeout\n");  
    }  
  
    return 0;  
}  

程序運行:
當ec_timeout = 3, run_time = 2時:
timeout = 3, run_time = 2
set timeout
running...
cancel timeout


當ec_timeout = 3, run_time = 4時:
timeout = 3, run_time = 4
set timeout
timeout
cancel timeout
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章