linux 模擬實現my_sleep的兩個版本

1.既然要講sleep,那麼大家就有必要了解一下什麼是信號

信號:是UNIX進程間通信的一種標準方式。

信號的產生:1.鍵盤快捷鍵

      2.異常

      3.操作系統命令和函數

      4.鬧鐘

信號的數量:64種,1-31是普通信號,34-64是是時時信號

my_sleep版本one(有bug):

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

void handler(int sig)
{}


int mysleep(int seconds)
{
	struct sigaction act, oact;
	act.sa_handler = handler;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	sigaction(SIGALRM, &act, &oact);

	alarm(seconds);
	pause();
	int _time = alarm(0);
	sigaction(SIGALRM, &oact, NULL);
	return _time;
}

int main()
{
	while(1)
	{
		printf("hello bite\n,%d",getpid());
		mysleep(3);
	}
	return 0;
}


my_sleep版本two:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

void handler(int sig)
{}


int mysleep(int seconds)
{
	struct sigaction act, oact;
	sigset_t nmask, onmask, unmask;

	act.sa_handler = handler;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	sigaction(SIGALRM, &act, &oact);

	sigemptyset(&nmask);
	sigaddset(&nmask, SIGALRM);
	sigprocmask(SIG_BLOCK,&nmask, &onmask);

	alarm(seconds);
//	pause();
	unmask = onmask;
	sigdelset(&unmask, SIGALRM);
	sigsuspend(&unmask);
	int _time = alarm(0);
	sigaction(SIGALRM, &oact, NULL);
	return _time;
}

int main()
{
	while(1)
	{
		printf("hello bite\n");
		mysleep(3);
	}
	return 0;
}


第一個sleep版本的bug是它是不可重入的,第二個版本改進了,利用信號屏蔽,將mysleep變成了可重入函數。

發佈了50 篇原創文章 · 獲贊 20 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章