程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> Linux C系統編程:信號與定時器的使用

Linux C系統編程:信號與定時器的使用

編輯:關於C
#include 
#include 


void do_alarm(int num);

int main(void)
{
        //注冊一個定時器


        if(signal(SIGALRM , do_alarm) == SIG_ERR)
        {
                perror("register alarm fail");
                return -1;
        }

        //alarm
        ////3秒之後發送SIGALRM信號,但是一次性的   SIGALRM信號:定時器的信號
        alarm(3);

        while(1)
        {
                printf("this is in main... \n");
                sleep(3);
        }

        return 0 ;
}

void do_alarm(int num)
{
        printf("this is in alarm ... &*&&\n");
        //會影響sleep
        alarm(1);
}

執行結果:

this is in main...
this is in alarm ... &*&&
this is in main...
this is in alarm ... &*&&
this is in main...
this is in alarm ... &*&&
this is in main...

......
在 這個頭文件中。


signal(參數1,參數2);

參數1:我們要進行處理的信號。系統的信號我們可以再終端鍵入 kill -l查看(共64個)。其實這些信號時系統定義的宏。

參數2:我們處理的方式(是系統默認還是忽略還是捕獲),這裡我寫了一個處理函數,也就是說這裡不是系統默認的。

unsigned int alarm(unsigned int seconds);

參數1:表示指定的秒數。

要注意的是,一個進程只能有一個鬧鐘時間,如果在調用alarm之前已設置過鬧鐘時間,則任何以前的鬧鐘時間都被新值所代替。需要注意的是,經過指定的秒數後,信號由內核產生,由於進程調度的延遲,所以進程得到控制從而能夠處理該信號還需要一些時間。如果有以前為進程登記的尚未超時的鬧鐘時鐘,而且本次調用的seconds值是0,則取消以前的鬧鐘時鐘,其余留值仍作為alarm函數的返回值。

以上程序是利用定時器產生的一個信號SIGALRM信號,在收到該信號同時會調用do_alarm函數。這也就類似單片機的定時中斷,當定時到了,就跳到中斷服務函數裡去執行相應的程序。

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