📄 signal.c
字号:
/*
miniTOS V0.1.4 1998-2005 (c) 林良水 (Lin LS)
miniTOS是一个开放源码的软件,授权LGPL,但开发人员不保证本软件的可靠性,
以及对您的损失负任何责任。
www.minitos.com
本文实现miniTOS signal。
create by Lin LS ,2005.3
Bug Report: mail to(林良水)testmyself@163.net
*/
#include <stdio.h>
#include "minitosdef.h"
#include "extdefine.h"
void SignalShell(void);
int InitSignal( void (*handler)(int) );
int StartSignal(int SignalMask);
int Signal(PROC *proc,int signal);
int InitSignal( void (*handler)(int) )
{
//入口为空,无效
if(handler==NULL)
{
return -2;
}
//设置handler
ptrCurrProc->SignalHandler=handler;
//判断是否已经有信号发过来了
if( (ptrCurrProc->signal & ptrCurrProc->EnableSignal)
&&( !ptrCurrProc->SignalInRun) )
{
//有,信号
ptrCurrProc->SignalInRun=TRUE;
SignalShell();
}
return 0;
}
int StartSignal(int SignalMask)
{
int OldMask;
OldMask=ptrCurrProc->EnableSignal;
//重设Enable Mask
ptrCurrProc->EnableSignal=SignalMask;
//判断是否已经有信号发过来了
if( (ptrCurrProc->signal & ptrCurrProc->EnableSignal)
&&( !ptrCurrProc->SignalInRun)
&&(ptrCurrProc->SignalHandler!=NULL ) )
{
//有,
ptrCurrProc->SignalInRun=TRUE;
SignalShell();
}
return OldMask;
}
int Signal(PROC *proc,int signal)
{
if(proc==NULL)
{
return (-2);
}
//结束的进程不运行signal子程序
if( (proc->status&PROC_TERMINATE)||(proc->status&PROC_FINISH) )
{
return -1;
}
//给proc signal
proc->signal=signal;
//判断有没有激活的signal
if( !(proc->signal & proc->EnableSignal) )
{
return 0;
}
//是本进程给本进程发signal
if(proc==ptrCurrProc)
{
//运行signal子进程
ptrCurrProc->SignalInRun=TRUE;
SignalShell();
}else
{
/* proc->SignalStart=TRUE;
proc->status_bak=proc->status;
set_signal_shell_register_and_stack();
if(proc->status!=0)
{
ready(proc);
proc->status=0;
sched();
}
*/
}
return 0;
}
void SignalShell(void)
{
int sig;
sig= ptrCurrProc->signal & ptrCurrProc->EnableSignal;
if( sig )
{
( *(ptrCurrProc->SignalHandler) )(sig);
}
ptrCurrProc->signal=0;
ptrCurrProc->SignalInRun=FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -