核心代碼示例
#include
#include
void do_alarm(int num);
int main() {
// 註冊 SIGALRM 處理函數
if (signal(SIGALRM, do_alarm) == SIG_ERR) {
perror("register alarm fail");
return -1;
}
// 3 秒後發送 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");
// 重置定時器為 1 秒(演示重複觸發)
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 ... &&
...
關鍵點解析
signal(sig, handler):註冊信號處理方式。SIG_ERR 表示失敗。信號列表可用 kill -l 查看(共 64 個)。
alarm(seconds):設置秒數後發送 SIGALRM。進程僅能有一個鬧鐘,再次調用覆蓋舊值。alarm(0) 取消鬧鐘並返回剩餘秒數。
- 信號處理函數中調用
alarm 可實現周期性定時器(類似單片機定時中斷)。
- 注意:
sleep 可能被信號中斷提前返回,實際項目中需處理 EINTR 重試。