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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章