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变成了可重入函数。