1. 程式人生 > >linux中的訊號3——alarm、pause函式

linux中的訊號3——alarm、pause函式

以下內容源於朱有鵬《物聯網大講堂》課程的學習,如有侵權,請告知刪除。

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();
}