欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談linux幾種定時(shí)函數(shù)的使用

 更新時(shí)間:2016年10月30日 11:46:06   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇淺談linux幾種定時(shí)函數(shù)的使用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

在程序開(kāi)發(fā)過(guò)程中,我們時(shí)不時(shí)要用到一些定時(shí)器,通常如果時(shí)間精度要求不高,可以使用sleep,uslepp函數(shù)讓進(jìn)程睡眠一段時(shí)間來(lái)實(shí)現(xiàn)定時(shí),

前者單位為秒(s),后者為微妙(us);但有時(shí)候我們又不想讓進(jìn)程睡眠阻塞在哪兒,我們需要進(jìn)程正常執(zhí)行,當(dāng)?shù)竭_(dá)規(guī)定的時(shí)間時(shí)再去執(zhí)行相應(yīng)的操作,

在linux下面我們一般使用alarm函數(shù)跟setitimer函數(shù)來(lái)實(shí)現(xiàn)定時(shí)功能;

下面對(duì)這兩個(gè)函數(shù)進(jìn)行詳細(xì)分析:

(1)alarm函數(shù)

alarm也稱為鬧鐘函數(shù),它可以在進(jìn)程中設(shè)置一個(gè)定時(shí)器,當(dāng)定時(shí)器指定的時(shí)間到時(shí),它向進(jìn)程發(fā)送SIGALRM信號(hào);

alarm函數(shù)原型如下:

unsigned int alarm(unsigned int seconds);
//seconds 為指定的秒數(shù)

所需頭文件
  #include<unistd.h>

函數(shù)原型
  unsigned int alarm(unsigned int seconds)

函數(shù)參數(shù)
  seconds:指定秒數(shù)

函數(shù)返回值
  成功:如果調(diào)用此alarm()前,進(jìn)程已經(jīng)設(shè)置了鬧鐘時(shí)間,則返回上一個(gè)鬧鐘時(shí)間的剩余時(shí)間,否則返回0。
  出錯(cuò):-1

下面是alarm()函數(shù)的簡(jiǎn)單例子:

void sigalrm_fn(int sig)  
 
{ 
  printf("alarm!\n"); 
  alarm(2); 
  return; 
} 
 
int main(void) 
 
{ 
  signal(SIGALRM, sigalrm_fn); //后面的函數(shù)必須是帶int參數(shù)的
  alarm(1); 
  while(1)  
  pause(); 
 
}

(2)setitimer()函數(shù)

在linux下如果對(duì)定時(shí)要求不太精確的話,使用alarm()和signal()就行了,但是如果想要實(shí)現(xiàn)精度較高的定時(shí)功能的話,就要使用setitimer函數(shù)。

setitimer()為L(zhǎng)inux的API,并非C語(yǔ)言的Standard Library,setitimer()有兩個(gè)功能,一是指定一段時(shí)間后,才執(zhí)行某個(gè)function,二是每間格一段時(shí)間就執(zhí)行某個(gè)function;

Linux為每個(gè)任務(wù)安排了3個(gè)內(nèi)部定時(shí)器:

ITIMER_REAL:實(shí)時(shí)定時(shí)器,不管進(jìn)程在何種模式下運(yùn)行(甚至在進(jìn)程被掛起時(shí)),它總在計(jì)數(shù)。定時(shí)到達(dá),向進(jìn)程發(fā)送SIGALRM信號(hào)。

ITIMER_VIRTUAL:這個(gè)不是實(shí)時(shí)定時(shí)器,當(dāng)進(jìn)程在用戶模式(即程序執(zhí)行時(shí))計(jì)算進(jìn)程執(zhí)行的時(shí)間。定時(shí)到達(dá)后向該進(jìn)程發(fā)送SIGVTALRM信號(hào)。

ITIMER_PROF:進(jìn)程在用戶模式(即程序執(zhí)行時(shí))和核心模式(即進(jìn)程調(diào)度用時(shí))均計(jì)數(shù)。定時(shí)到達(dá)產(chǎn)生SIGPROF信號(hào)。ITIMER_PROF記錄的時(shí)間比ITIMER_VIRTUAL多了進(jìn)程調(diào)度所花的時(shí)間。

定時(shí)器在初始化是,被賦予一個(gè)初始值,隨時(shí)間遞減,遞減至0后發(fā)出信號(hào),同時(shí)恢復(fù)初始值。在任務(wù)中,我們可以一種或者全部三種定時(shí)器,但同一時(shí)刻同一類型的定時(shí)器只能使用一個(gè)。

setitimer函數(shù)原型如下:

#include <sys/time.h>

    int setitimer(int which, const struct itimerval *new_value,
           struct itimerval *old_value);

 Timer values are defined by the following structures:

      struct itimerval {
        struct timeval it_interval; /* next value */
        struct timeval it_value;  /* current value */
      };

      struct timeval {
        time_t   tv_sec;     /* seconds */
        suseconds_t tv_usec;    /* microseconds */
      };

it_interval用來(lái)指定每隔多長(zhǎng)時(shí)間執(zhí)行任務(wù), it_value用來(lái)保存當(dāng)前時(shí)間離執(zhí)行任務(wù)還有多長(zhǎng)時(shí)間。比如說(shuō), 你指定it_interval為2秒(微秒為0),開(kāi)始的時(shí)候我們把it_value的時(shí)間也設(shè)定為2秒(微秒為0),當(dāng)過(guò)了一秒, it_value就減少一個(gè)為1, 再過(guò)1秒,則it_value又減少1,變?yōu)?,這個(gè)時(shí)候發(fā)出信號(hào)(告訴用戶時(shí)間到了,可以執(zhí)行任務(wù)了),并且系統(tǒng)自動(dòng)把it_value的時(shí)間重置為 it_interval的值,即2秒,再重新計(jì)數(shù)

下面是setitimer簡(jiǎn)單實(shí)例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>

void test_func()
{
  static count = 0;

  printf("count is %d\n", count++);
}

void init_sigaction()
{
  struct sigaction act;
     
  act.sa_handler = test_func; //設(shè)置處理信號(hào)的函數(shù)
  act.sa_flags = 0;

  sigemptyset(&act.sa_mask);
  sigaction(SIGPROF, &act, NULL);//時(shí)間到發(fā)送SIGROF信號(hào)
}

void init_time()
{
  struct itimerval val;
     
  val.it_value.tv_sec = 1; //1秒后啟用定時(shí)器
  val.it_value.tv_usec = 0;

  val.it_interval = val.it_value; //定時(shí)器間隔為1s

  setitimer(ITIMER_PROF, &val, NULL);
}

int main(int argc, char **argv)
{

  init_sigaction();
  init_time();

  while(1);

  return 0;
}

可以看出每個(gè)一秒輸出一個(gè)count的值:

下面是運(yùn)行結(jié)果:

[root@localhost 5th]# ./test
count is 0
count is 1
count is 2
count is 3
count is 4
count is 5
count is 6
count is 7
count is 8
count is 9

附錄:

signal

1. 頭文件
#include <signal.h>

2. 功能
設(shè)置某一信號(hào)的對(duì)應(yīng)動(dòng)作

3. 函數(shù)原型
void (*signal(int signum,void(* handler)(int)))(int);

分解來(lái)看:

typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);

第一個(gè)參數(shù)是目標(biāo)信號(hào)。func參數(shù)是一個(gè)指針,指向某個(gè)處理該信號(hào)的函數(shù)。這個(gè)處理信號(hào)函數(shù)帶有一個(gè)int型參數(shù),并應(yīng)返回void。
func參數(shù)也可以設(shè)定為下面的一些值:
SIG_IGN: 如果func參數(shù)被設(shè)置為SIG_IGN,該信號(hào)將被忽略。
SIG_DFL: 如果func參數(shù)被設(shè)置為SIG_DFL,該信號(hào)會(huì)按照確定行為處理。

4. sig信號(hào)的可能類型

1) #define SIGHUP 1 /* hangup */

SIGHUP是Unix系統(tǒng)管理員很常用的一個(gè)信號(hào)。許多后臺(tái)服務(wù)進(jìn)程在接受到該信號(hào)后將會(huì)重新讀取它們的配置文件。然而,該信號(hào)的實(shí)際功能是通知進(jìn)程它的控制終端被斷開(kāi)。缺省行為是終止進(jìn)程。

2) #define SIGINT 2 /* interrupt */

對(duì)于Unix使用者來(lái)說(shuō),SIGINT是另外一個(gè)常用的信號(hào)。許多shell的CTRL-C組合使得這個(gè)信號(hào)被大家所熟知。該信號(hào)的正式名字是中斷信號(hào)。缺省行為是終止進(jìn)程。

3) #define SIGQUIT 3 /* quit */

SIGQUIT信號(hào)被用于接收shell的CTRL-/組合。另外,它還用于告知進(jìn)程退出。這是一個(gè)常用信號(hào),用來(lái)通知應(yīng)用程序從容的(譯注:即在結(jié)束前執(zhí)行一些退出動(dòng)作)關(guān)閉。缺省行為是終止進(jìn)程,并且創(chuàng)建一個(gè)核心轉(zhuǎn)儲(chǔ)。

4) #define SIGILL 4 /* illegal instr. (not reset when caught) */

如果正在執(zhí)行的進(jìn)程中包含非法指令,操作系統(tǒng)將向該進(jìn)程發(fā)送SIGILL信號(hào)。如果你的程序使用了線程,或者pointer functions,那么可能的話可以嘗試捕獲該信號(hào)來(lái)協(xié)助調(diào)試。([color=Red]注意:原文這句為:“If your program makes use of use of threads, or pointer functions, try to catch this signal if possible for aid in debugging.”。中間的兩個(gè)use of use of,不知是原書(shū)排版的瑕疵還是我確實(shí)沒(méi)有明白其意義;另外,偶經(jīng)常聽(tīng)說(shuō)functions pointer,對(duì)于pointer functions,google了一下,應(yīng)該是fortran里面的東西,不管怎樣,還真不知道,確切含義還請(qǐng)知道的兄弟斧正。[/color])缺省行為是終止進(jìn)程,并且創(chuàng)建一個(gè)核心轉(zhuǎn)儲(chǔ)。

5) #define SIGTRAP 5 /* trace trap (not reset when caught) */

SIGTRAP這個(gè)信號(hào)是由POSIX標(biāo)準(zhǔn)定義的,用于調(diào)試目的。當(dāng)被調(diào)試進(jìn)程接收到該信號(hào)時(shí),就意味著它到達(dá)了某一個(gè)調(diào)試斷點(diǎn)。一旦這個(gè)信號(hào)被交付,被調(diào)試的進(jìn)程就會(huì)停止,并且它的父進(jìn)程將接到通知。缺省行為是終止進(jìn)程,并且創(chuàng)建一個(gè)核心轉(zhuǎn)儲(chǔ)。

6) #define SIGABRT 6 /* abort() */

SIGABRT提供了一種在異常終止(abort)一個(gè)進(jìn)程的同時(shí)創(chuàng)建一個(gè)核心轉(zhuǎn)儲(chǔ)的方法。然而如果該信號(hào)被捕獲,并且信號(hào)處理句柄沒(méi)有返回,那么進(jìn)程不會(huì)終止。缺省行為是終止進(jìn)程,并且創(chuàng)建一個(gè)核心轉(zhuǎn)儲(chǔ)。

7) #define SIGFPE 8 /* floating point exception */

當(dāng)進(jìn)程發(fā)生一個(gè)浮點(diǎn)錯(cuò)誤時(shí),SIGFPE信號(hào)被發(fā)送給該進(jìn)程。對(duì)于那些處理復(fù)雜數(shù)學(xué)運(yùn)算的程序,一般會(huì)建議你捕獲該信號(hào)。缺省行為是終止進(jìn)程,并且創(chuàng)建一個(gè)核心轉(zhuǎn)儲(chǔ)。

8) #define SIGKILL 9 /* kill (cannot be caught or ignored) */

SIGKILL是這些信號(hào)中最難對(duì)付的一個(gè)。正如你在它旁邊的注釋中看到的那樣,這個(gè)信號(hào)不能被捕獲或忽略。一旦該信號(hào)被交付給一個(gè)進(jìn)程,那么這個(gè)進(jìn)程就會(huì)終止。然而,會(huì)有一些極少數(shù)情況SIGKILL不會(huì)終止進(jìn)程。這些罕見(jiàn)的情形在處理一個(gè)“非中斷操作”(比如磁盤I/O)的時(shí)候發(fā)生。雖然這樣的情形極少發(fā)生,然而一旦發(fā)生的話,會(huì)造成進(jìn)程死鎖。唯一結(jié)束進(jìn)程的辦法就只有重新啟動(dòng)了。缺省行為是終止進(jìn)程。

9) #define SIGBUS 10 /* bus error */

如同它的名字暗示的那樣,CPU檢測(cè)到數(shù)據(jù)總線上的錯(cuò)誤時(shí)將產(chǎn)生SIGBUS信號(hào)。當(dāng)程序嘗試去訪問(wèn)一個(gè)沒(méi)有正確對(duì)齊的內(nèi)存地址時(shí)就會(huì)產(chǎn)生該信號(hào)。缺省行為是終止進(jìn)程,并且創(chuàng)建一個(gè)核心轉(zhuǎn)儲(chǔ)。

10) #define SIGSEGV 11 /* segmentation violation */

SIGSEGV是另一個(gè)C/C++程序員很熟悉的信號(hào)。當(dāng)程序沒(méi)有權(quán)利訪問(wèn)一個(gè)受保護(hù)的內(nèi)存地址時(shí),或者訪問(wèn)無(wú)效的虛擬內(nèi)存地址(臟指針,dirty pointers,譯注:由于沒(méi)有和后備存儲(chǔ)器中內(nèi)容進(jìn)行同步而造成。關(guān)于野指針,可以參見(jiàn)http://en.wikipedia.org/wiki/Wild_pointer 的解釋。)時(shí),會(huì)產(chǎn)生這個(gè)信號(hào)。缺省行為是終止進(jìn)程,并且創(chuàng)建一個(gè)核心轉(zhuǎn)儲(chǔ)。

11) #define SIGSYS 12 /* non-existent system call invoked */

SIGSYS信號(hào)會(huì)在進(jìn)程執(zhí)行一個(gè)不存在的系統(tǒng)調(diào)用時(shí)被交付。操作系統(tǒng)會(huì)交付該信號(hào),并且進(jìn)程會(huì)被終止。缺省行為是終止進(jìn)程,并且創(chuàng)建一個(gè)核心轉(zhuǎn)儲(chǔ)。

12) #define SIGPIPE 13 /* write on a pipe with no one to read it */

管道的作用就像電話一樣,允許進(jìn)程之間的通信。如果進(jìn)程嘗試對(duì)管道執(zhí)行寫操作,然而管道的另一邊卻沒(méi)有回應(yīng)者時(shí),操作系統(tǒng)會(huì)將SIGPIPE信號(hào)交付給這個(gè)討厭的進(jìn)程(這里就是那個(gè)打算寫入的進(jìn)程)。缺省行為是終止進(jìn)程。

13) #define SIGALRM 14 /* alarm clock */

在進(jìn)程的計(jì)時(shí)器到期的時(shí)候,SIGALRM信號(hào)會(huì)被交付(delivered)給進(jìn)程。這些計(jì)時(shí)器由本章后面將會(huì)提及
的setitimer和alarm調(diào)用設(shè)置。缺省行為是終止進(jìn)程。

14) #define SIGTERM 15 /* software termination signal from kill */

SIGTERM信號(hào)被發(fā)送給進(jìn)程,通知該進(jìn)程是時(shí)候終止了,并且在終止之前做一些清理活動(dòng)。SIGTERM信號(hào)是Unix的kill命令發(fā)送的缺省信號(hào),同時(shí)也是操作系統(tǒng)關(guān)閉時(shí)向進(jìn)程發(fā)送的缺省信號(hào)。缺省行為是終止進(jìn)程。

15) #define SIGURG 16 /* urgent condition on IO channel */

在進(jìn)程已打開(kāi)的套接字上發(fā)生某些情況時(shí),SIGURG將被發(fā)送給該進(jìn)程。如果進(jìn)程不捕獲這個(gè)信號(hào)的話,那么將被丟棄。缺省行為是丟棄這個(gè)信號(hào)。

16) #define SIGSTOP 17 /* sendable stop signal not from tty */

本信號(hào)不能被捕獲或忽略。一旦進(jìn)程接收到SIGSTOP信號(hào),它會(huì)立即停止(stop),直到接收到另一個(gè)SIGCONT
信號(hào)為止。缺省行為是停止進(jìn)程,直到接收到一個(gè)SIGCONT信號(hào)為止。

17) #define SIGTSTP 18 /* stop signal from tty */

SIGSTP與SIGSTOP類似,它們的區(qū)別在于SIGSTP信號(hào)可以被捕獲或忽略。當(dāng)shell從鍵盤接收到CTRL-Z的時(shí)候就會(huì)交付(deliver)這個(gè)信號(hào)給進(jìn)程。缺省行為是停止進(jìn)程,直到接收到一個(gè)SIGCONT信號(hào)為止。

18) #define SIGCONT 19 /* continue a stopped process */

SIGCONT也是一個(gè)有意思的信號(hào)。如前所述,當(dāng)進(jìn)程停止的時(shí)候,這個(gè)信號(hào)用來(lái)告訴進(jìn)程恢復(fù)運(yùn)行。該信號(hào)的有趣的地方在于:它不能被忽略或阻塞,但可以被捕獲。這樣做很有意義:因?yàn)檫M(jìn)程大概不愿意忽略或阻塞SIGCONT信號(hào),否則,如果進(jìn)程接收到SIGSTOP或SIGSTP的時(shí)候該怎么辦?缺省行為是丟棄該信號(hào)。

19) #define SIGCHLD 20 /* to parent on child stop or exit */

SIGCHLD是由Berkeley Unix引入的,并且比SRV 4 Unix上的實(shí)現(xiàn)有更好的接口。(如果信號(hào)是一個(gè)沒(méi)有追溯能力的過(guò)程(not a retroactive process),那么BSD的SIGCHID信號(hào)實(shí)現(xiàn)會(huì)比較好。在system V Unix的實(shí)現(xiàn)中,如果進(jìn)程要求捕獲該信號(hào),操作系統(tǒng)會(huì)檢查是否存在有任何未完成的子進(jìn)程(這些子進(jìn)程是已經(jīng)退出exit)的子進(jìn)程,并且在等待調(diào)用wait的父進(jìn)程收集它們的狀態(tài))。如果子進(jìn)程退出的時(shí)候附帶有一些終止信息(terminating information),那么信號(hào)處理句柄就會(huì)被調(diào)用。所以,僅僅要求捕獲這個(gè)信號(hào)會(huì)導(dǎo)致信號(hào)處理句柄被調(diào)用(譯注:即是上面說(shuō)的“信號(hào)的追溯能力”),而這是卻一種相當(dāng)混亂的狀況。)一旦一個(gè)進(jìn)程的子進(jìn)程狀態(tài)發(fā)生改變,SIGCHLD信號(hào)就會(huì)被發(fā)送給該進(jìn)程。就像我在前面章節(jié)提到的,父進(jìn)程雖然可以fork出子進(jìn)程,但沒(méi)有必要等待子進(jìn)程退出。一般來(lái)說(shuō)這是不太好的,因?yàn)檫@樣的話,一旦進(jìn)程退出就可能會(huì)變成一個(gè)僵尸進(jìn)程??墒侨绻高M(jìn)程捕獲SIGCHLD信號(hào)的話,它就可以使用wait系列調(diào)用中的某一個(gè)去收集子進(jìn)程狀態(tài),或者判斷發(fā)生了什么事情。當(dāng)發(fā)送SIGSTOP,SIGSTP或SIGCONF信號(hào)給子進(jìn)程時(shí),SIGCHLD信號(hào)也會(huì)被發(fā)送給父進(jìn)程。缺省行為是丟棄該信號(hào)。

20) #define SIGTTIN 21 /* to readers pgrp upon background tty read */

當(dāng)一個(gè)后臺(tái)進(jìn)程嘗試進(jìn)行一個(gè)讀操作時(shí),SIGTTIN信號(hào)被發(fā)送給該進(jìn)程。進(jìn)程將會(huì)阻塞直到接收到SIGCONT信號(hào)為止。缺省行為是停止進(jìn)程,直到接收到SIGCONT信號(hào)。

21) #define SIGTTOU 22 /* like TTIN if (tp->t_local&LTOSTOP) */

SIGTTOU信號(hào)與SIGTTIN很相似,不同之處在于SIGTTOU信號(hào)是由于后臺(tái)進(jìn)程嘗試對(duì)一個(gè)設(shè)置了TOSTOP屬性的tty執(zhí)行寫操作時(shí)才會(huì)產(chǎn)生。然而,如果tty沒(méi)有設(shè)置這個(gè)屬性,SIGTTOU就不會(huì)被發(fā)送。缺省行為是停止進(jìn)程,直到接收到SIGCONT信號(hào)。

22) #define SIGIO 23 /* input/output possible signal */

如果進(jìn)程在一個(gè)文件描述符上有I/O操作的話,SIGIO信號(hào)將被發(fā)送給這個(gè)進(jìn)程。進(jìn)程可以通過(guò)fcntl調(diào)用來(lái)設(shè)置。缺省行為是丟棄該信號(hào)。

23) #define SIGXCPU 24 /* exceeded CPU time limit */

如果一旦進(jìn)程超出了它可以使用的CPU限制(CPU limit),SIGXCPU信號(hào)就被發(fā)送給它。這個(gè)限制可以使用隨后討論的setrlimit設(shè)置。缺省行為是終止進(jìn)程。

24) #define SIGXFSZ 25 /* exceeded file size limit */

如果一旦進(jìn)程超出了它可以使用的文件大小限制,SIGXFSZ信號(hào)就被發(fā)送給它。稍后我們會(huì)繼續(xù)討論這個(gè)信號(hào)。缺省行為是終止進(jìn)程。

25) #define SIGVTALRM 26 /* virtual time alarm */

如果一旦進(jìn)程超過(guò)了它設(shè)定的虛擬計(jì)時(shí)器計(jì)數(shù)時(shí),SIGVTALRM信號(hào)就被發(fā)送給它。缺省行為是終止進(jìn)程。

26) #define SIGPROF 27 /* profiling time alarm */

當(dāng)設(shè)置了計(jì)時(shí)器時(shí),SIGPROF是另一個(gè)將會(huì)發(fā)送給進(jìn)程的信號(hào)。缺省行為是終止進(jìn)程。

27) #define SIGWINCH 28 /* window size changes */

當(dāng)進(jìn)程調(diào)整了終端的行或列時(shí)(比如增大你的xterm的尺寸),SIGWINCH信號(hào)被發(fā)送給該進(jìn)程。缺省行為是丟棄該信號(hào)。

28) #define SIGUSR1 29 /* user defined signal 1 */

29) #define SIGUSR2 30 /* user defined signal 2 */

SIGUSR1和SIGUSR2這兩個(gè)信號(hào)被設(shè)計(jì)為用戶指定。它們可以被設(shè)定來(lái)完成你的任何需要。換句話說(shuō),操作系統(tǒng)沒(méi)有任何行為與這兩個(gè)信號(hào)關(guān)聯(lián)。缺省行為是終止進(jìn)程。(譯注:按原文的意思翻譯出來(lái)似乎這兩句話有點(diǎn)矛盾。)

5. 例子

5.1. Linux下的Ctrl+C在Windows下的實(shí)現(xiàn)

Linux下通常的做法:

signal(SIGINT, sigfunc); // 設(shè)置信號(hào)
void sigfunc(int signo)
  {
   ... //處理信號(hào)相關(guān)的操作
  }

以下是Linux下的Ctrl+C在Windows下的實(shí)現(xiàn)

#include <stdio.h>
  #include <windows.h>
  static is_loop = 1;
  // 捕獲控制臺(tái) Ctrl+C 事件的函數(shù)
  BOOL CtrlHandler( DWORD fdwCtrlType )
  {
   switch (fdwCtrlType)
   {
   /* Handle the CTRL-C signal. */
   case CTRL_C_EVENT:
     printf("CTRL_C_EVENT \n");
     break;
   case CTRL_CLOSE_EVENT:
     printf("CTRL_CLOSE_EVENT \n");
     break;
   case CTRL_BREAK_EVENT:
     printf("CTRL_BREAK_EVENT \n");
     break;
   case CTRL_LOGOFF_EVENT:
     printf("CTRL_LOGOFF_EVENT \n");
     break;
   case CTRL_SHUTDOWN_EVENT:
     printf("CTRL_SHUTDOWN_EVENT \n");
     break;
   default:
     return FALSE;
   }
   is_loop = 0;
   return (TRUE);
  }

  int main(int argc, char *argv[])
  {
   printf("Set Console Ctrl Handler\n");
   SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
   while (is_loop);
   return 0;
  }

5.2.Linux下的Ctrl+C在Windows下的實(shí)現(xiàn)二

#include <stdio.h>
  #include <windows.h>
  #define CONTRL_C_HANDLE() signal(3, exit)
  int main(int argc, char *argv[])
  {
   printf("Set Console Ctrl Handler\n");
   CONTRL_C_HANDLE();
   while (1);
   system("PAUSE");
   return 0;
  }

以上就是小編為大家?guī)?lái)的淺談linux幾種定時(shí)函數(shù)的使用全部?jī)?nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • Apache下禁止特定目錄執(zhí)行PHP 提高服務(wù)器安全性

    Apache下禁止特定目錄執(zhí)行PHP 提高服務(wù)器安全性

    之前在博文從PHP安全講DedeCms的安全加固中說(shuō)過(guò)在PHP安全中保護(hù)“可寫目錄下的文件不允許被訪問(wèn)到的重要性,還提出了改名文件夾的方式來(lái)保護(hù)該目錄。
    2009-11-11
  • Centos7.5配置java環(huán)境安裝tomcat的講解

    Centos7.5配置java環(huán)境安裝tomcat的講解

    今天小編就為大家分享一篇關(guān)于Centos7.5配置java環(huán)境安裝tomcat的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Linux系統(tǒng)下SystemC環(huán)境配置方法

    Linux系統(tǒng)下SystemC環(huán)境配置方法

    大家好,本篇文章主要講的是Linux系統(tǒng)下SystemC環(huán)境配置方法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Linux系統(tǒng)開(kāi)機(jī)無(wú)限重啟的解決方案

    Linux系統(tǒng)開(kāi)機(jī)無(wú)限重啟的解決方案

    這篇文章主要介紹了Linux系統(tǒng)開(kāi)機(jī)無(wú)限重啟的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解linux下tar壓縮解壓縮文件夾的命令與參數(shù)

    詳解linux下tar壓縮解壓縮文件夾的命令與參數(shù)

    大家都知道壓縮文件或者文件夾可以為磁盤節(jié)省不少空間,那么Linux系統(tǒng)的壓縮和解壓縮命令都有哪些呢?參數(shù)又有哪些呢?下面小編就給大家介紹Linux下tar壓縮和解壓縮文件夾的命令與參數(shù),希望本文的內(nèi)容對(duì)你能有所幫助。
    2016-11-11
  • Linux cal命令的使用

    Linux cal命令的使用

    這篇文章主要介紹了Linux cal命令的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • VMware虛擬機(jī)中Ubuntu18.04無(wú)法連接網(wǎng)絡(luò)的解決辦法

    VMware虛擬機(jī)中Ubuntu18.04無(wú)法連接網(wǎng)絡(luò)的解決辦法

    這篇文章主要為大家詳細(xì)介紹了VMware虛擬機(jī)中Ubuntu18.04無(wú)法連接網(wǎng)絡(luò)的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 詳解linux 關(guān)機(jī)命令總結(jié)

    詳解linux 關(guān)機(jī)命令總結(jié)

    本篇文章主要介紹了linux 關(guān)機(jī)命令總結(jié),linux下常用的關(guān)機(jī)命令有:shutdown、halt、poweroff、init,有興趣的可以了解一下。
    2016-12-12
  • 阿里云服務(wù)器ubuntu 配置教程

    阿里云服務(wù)器ubuntu 配置教程

    這篇文章主要介紹了阿里云服務(wù)器ubuntu 配置方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Apache偽靜態(tài)Rewrite詳解

    Apache偽靜態(tài)Rewrite詳解

    這篇文章主要介紹了Apache偽靜態(tài)Rewrite的相關(guān)知識(shí)以及使用方法和使用實(shí)例,需要的朋友可以參考下
    2014-03-03

最新評(píng)論