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變成了可重入函數。