linux中的訊號3——alarm、pause函式
阿新 • • 發佈:2019-02-19
以下內容源於朱有鵬《物聯網大講堂》課程的學習,如有侵權,請告知刪除。
1、alarm函式
- 核心以API形式提供的鬧鐘;
- 可以為當前程序定義鬧鐘,時間到了會發出SIGALRM訊號。
- 每個程序只能有一個alarm,當重新定義時,會重新計時。
- 注意函式的返回值,見上圖文字。
ret = alarm(5); printf("1st, ret = %d.\n", ret); sleep(3); ret = alarm(5); // 返回值是2但是本次alarm會重新定5s printf("2st, ret = %d.\n", ret); sleep(1); ret = alarm(5); //返回值時4,但是本次的alarm會重新定5s printf("3st, ret = %d.\n", ret);
2、pause函式
- pause函式的作用,是讓當前程序暫停執行,交出CPU給其他程序去執行;
- 當前程序進入pause狀態後,當前程序會表現為“卡住、阻塞住”;
- 要退出pause狀態,當前程序需要被訊號喚醒。
3、使用alarm和pause來模擬sleep
#include <stdio.h> #include <unistd.h> // unix standand #include <signal.h> void func(int sig) { /* if (sig == SIGALRM) { printf("alarm happened.\n"); } */ } void mysleep(unsigned int seconds); int main(void) { printf("before mysleep.\n"); mysleep(3); printf("after mysleep.\n"); /* unsigned int ret = -1; struct sigaction act = {0}; act.sa_handler = func; sigaction(SIGALRM, &act, NULL); //signal(SIGALRM, func); ret = alarm(5); printf("1st, ret = %d.\n", ret); sleep(3); ret = alarm(5); // 返回值是2但是本次alarm會重新定5s printf("2st, ret = %d.\n", ret); sleep(1); ret = alarm(5); //返回值時4,但是本次的alarm會重新定5s printf("3st, ret = %d.\n", ret); //while (1); pause(); */ return 0; } void mysleep(unsigned int seconds) { struct sigaction act = {0};// act.sa_handler = func;// sigaction(SIGALRM, &act, NULL);//這三行應該能省略吧? alarm(seconds); pause(); }