没有合适的资源?快使用搜索试试~ 我知道了~
首页linux 下实现sleep详解及简单实例
linux 下实现sleep详解及简单实例 sleep: 普通版本 1、基本设计思路: 1>注册SIGALRM信号的处理函数; 2>调用alarm(nsecs)设定闹钟; 3>调⽤pause等待,内核切换到别的进程运行; 4>nsecs秒之后,闹钟超时,内核发SIGALRM给这个进程 ; 5>从内核态返回这个进程的⽤户态之前处理未决信号,发现有SIGALRM信号,其处理函数是sig_alrm; 6> 切换到用户态执行sig_alrm函数,进⼊sig_alrm函数时SIGALRM信号被⾃动屏蔽,从sig_alrm函数返回SIGALRM信 号⾃动解除屏蔽。然后
资源详情
资源评论
资源推荐

linux 下实现下实现sleep详解及简单实例详解及简单实例
linux 下实现下实现sleep详解及简单实例详解及简单实例
sleep:
普通版本普通版本
1、基本设计思路:
1>注册SIGALRM信号的处理函数;
2>调用alarm(nsecs)设定闹钟;
3>调pause等待,内核切换到别的进程运行;
4>nsecs秒之后,闹钟超时,内核发SIGALRM给这个进程 ;
5>从内核态返回这个进程的户态之前处理未决信号,发现有SIGALRM信号,其处理函数是sig_alrm;
6> 切换到用户态执行sig_alrm函数,进sig_alrm函数时SIGALRM信号被动屏蔽,从sig_alrm函数返回SIGALRM信 号动解除屏
蔽。然后动执系统调用sigreturn再次进入内核,再返回用户态继续执行进程的主控制流程(main函数调的mysleep函数);
7>pause函数返回-1,然后调alarm(0)取消闹钟,调sigaction恢复SIGALRM信号以前的处理动作。
2、实现代码、实现代码
#include<stdio.h>
#include<signal.h>
void handler(int signo)
{}
int mysleep(int timeout)
{
struct sigaction act,oact;
act.sa_handler = handler;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM,&act,&oact);
alarm(timeout);
pause();
int ret = alarm(0);
sigaction(SIGALRM,&oact,NULL);
return ret;
}
int main()
{
while(1)
{
printf("using musleep!");
mysleep(3);
}
return 0;
}
相关函数分析:
#include <unistd.h>
int pause(void);
pause函数函数使调进程挂起直到有信号递达。如果信号的处理动作是终进程,则进程终,pause函数没有机会返回;如果信号的处
理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调了信号处理函数之后pause返回-
1,errno设置为EINTR, 所以pause只有出错的返回值 。
sigaction函数函数
#include <signal.h>

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0