alarm函數???
設置定時器(鬧鐘)。在指定seconds后,內核會給當前進程發送14)SIGALRM信號。進程收到該信號,默認動作終止。
每個進程都有且只有唯一個定時器。
unsigned int alarm(unsigned int seconds); 返回0或剩余的秒數,無失敗。
?????? 常用:取消定時器alarm(0),返回舊鬧鐘余下秒數。
?????? 例:alarm(5) → 3sec → alarm(4) → 5sec → alarm(5) → alarm(0)
??? 定時,與進程狀態無關(自然定時法)!就緒、運行、掛起(阻塞、暫停)、終止、僵尸...無論進程處于何種狀態,alarm都計時。
練習:編寫程序,測試你使用的計算機1秒鐘能數多少個數。?? ??????????????????????????? ????????????? 【alarm .c】
?????? 使用time命令查看程序執行的時間。???? 程序運行的瓶頸在于IO,優化程序,首選優化IO。
?????? 實際執行時間 = 系統時間 + 用戶時間 + 等待時間
?
/*** alarm.c ***/ #include<stdio.h> #include<unistd.h>int main() {int i;alarm(1);for(i = 0; ; i++){printf("%d\n",i);}return 0; }
/*** my_alarm.c ***/ #include<stdio.h> #include<sys/time.h> #include<stdlib.h> #include<unistd.h>/* struct itimerval{struct timeval{it_value.tv_sec;it_value.tv_usec;}it_interval;struct timerval{it_value.tv_sec;it_value.tv_usec;}it_value; }it,oldit;*/ unsigned int my_alarm(unsigned int sec) {struct itimerval it,oldit;int ret;it.it_value.tv_sec = sec;it.it_value.tv_usec = sec;it.it_interval.tv_sec = sec;it.it_interval.tv_usec = sec;ret = setitimer(ITIMER_REAL,&it,&oldit);if(-1 == ret){perror("setitimer");exit(1);}return oldit.it_value.tv_sec;}int main() {int i;my_alarm(1);for(i = 0; ; i++){printf("i = %d\n",i);}return 0; }
?
setitimer函數
???????? 設置定時器(鬧鐘)。 可代替alarm函數。精度微秒us,可以實現周期定時。
??? int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);??? 成功:0;失敗:-1,設置errno
???????? 參數:which:指定定時方式
????????????????? ① 自然定時:ITIMER_REAL → 14)SIGLARM?????????????????????????? ?????????????? 計算自然時間
????????????????? ② 虛擬空間計時(用戶空間):ITIMER_VIRTUAL → 26)SIGVTALRM? ? ?只計算進程占用cpu的時間
????????????????? ③ 運行時計時(用戶+內核):ITIMER_PROF → 27)SIGPROF????????? 計算占用cpu及執行系統調用的時間
練習: 使用setitimer函數實現alarm函數,重復計算機1秒數數程序。????????????? ???????? ???????? ???????? 【setitimer.c】
拓展練習,結合man page編寫程序,測試it_interval、it_value這兩個參數的作用。???? ???????? 【setitimer1.c】
提示:??? it_interval:用來設定兩次定時任務之間間隔的時間。
???????? ??????? ???????? ???????? it_value:定時的時長????????????????????????????
兩個參數都設置為0,即清0操作。
?
raise和abort函數
?????? raise 函數:給當前進程發送指定信號(自己給自己發)?? raise(signo) == kill(getpid(), signo);
??? ?????? int raise(int sig); 成功:0,失敗非0值
?????? abort 函數:給自己發送異常終止信號 6) SIGABRT 信號,終止并產生core文件
??? ?????? void abort(void); 該函數無返回
?