程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 使用alarm和setjmp實現超時控制

使用alarm和setjmp實現超時控制

編輯:C++入門知識

[cpp]
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <signal.h>  
#include <setjmp.h>  
 
#define JMP_VALUE 12345  
 
static jmp_buf test_jmp_env; 
 
static void test_alarm(int n) 

    printf("alarm signal:%d\r\n", n); 
    longjmp(test_jmp_env, JMP_VALUE); 

 
void DoSomething() 

    int i = 0; 
    while(1){ 
        printf("%d\r\n", i++); 
        sleep(1); 
    } 

 
void DoSomethingWithTimeout(int nTimeout) 

    __sighandler_t old_handler = signal(SIGALRM, test_alarm); 
 
    alarm(nTimeout); 
 
    int n = setjmp(test_jmp_env); 
    printf("setjmp result:%d\r\n", n); 
 
    if(JMP_VALUE == n){ 
        signal(SIGALRM, old_handler); 
        return; 
    } 
    else if(0 == n) 
    { 
        DoSomething(); 
        alarm(0); 
        signal(SIGALRM, old_handler); 
    } 
    else 
    { 
        printf("error\r\n"); 
        exit(-1); 
    } 

 
int main(void) 

    DoSomethingWithTimeout(5); 
 
    printf("go on to do...\r\n"); 
 
    return 0; 

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

#define JMP_VALUE 12345

static jmp_buf test_jmp_env;

static void test_alarm(int n)
{
 printf("alarm signal:%d\r\n", n);
    longjmp(test_jmp_env, JMP_VALUE);
}

void DoSomething()
{
 int i = 0;
 while(1){
  printf("%d\r\n", i++);
  sleep(1);
 }
}

void DoSomethingWithTimeout(int nTimeout)
{
 __sighandler_t old_handler = signal(SIGALRM, test_alarm);

 alarm(nTimeout);

 int n = setjmp(test_jmp_env);
 printf("setjmp result:%d\r\n", n);

 if(JMP_VALUE == n){
  signal(SIGALRM, old_handler);
  return;
 }
 else if(0 == n)
 {
  DoSomething();
  alarm(0);
  signal(SIGALRM, old_handler);
 }
 else
 {
  printf("error\r\n");
  exit(-1);
 }
}

int main(void)
{
 DoSomethingWithTimeout(5);

 printf("go on to do...\r\n");

 return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved