📄 signal.c
字号:
/* MShowTec - www.mshowtec.com
** msLinux signal.c ver1.0
** 20051221 lmjx create limiao@mshowtec.com
**
*/
#define MSLINUX_SIGNAL_C
#include "signal.h"
#include "sched.h"
int sys_sgetmask ()
{
return current->blocked;
}
int sys_ssetmask (int newmask)
{
int old = current->blocked;
current->blocked = newmask & ~(1 << (SIGKILL - 1));
return old;
}
static __inline void save_old (char *from, char *to)
{
int i;
for (i = 0; i < sizeof (struct sigaction); i++)
{
*to++ = *from++;
}
}
static __inline void get_new (char *from, char *to)
{
int i;
for (i = 0; i < sizeof (struct sigaction); i++)
*to++ = *from++;
}
int sys_signal (int signum, long handler, long restorer)
{
struct sigaction tmp;
if (signum < 1 || signum > 32 || signum == SIGKILL)
return -1;
tmp.sa_handler = (void (*)(int)) handler;
tmp.sa_mask = 0;
tmp.sa_flags = SA_ONESHOT | SA_NOMASK;
tmp.sa_restorer = (void (*)(void)) restorer;
handler = (long) current->sigaction[signum - 1].sa_handler;
current->sigaction[signum - 1] = tmp;
return handler;
}
int sys_sigaction (int signum, const struct sigaction *action,
struct sigaction *oldaction)
{
struct sigaction tmp;
if (signum < 1 || signum > 32 || signum == SIGKILL)
return -1;
tmp = current->sigaction[signum - 1];
get_new ((char *) action, (char *) (signum - 1 + current->sigaction));
if (oldaction)
save_old ((char *) &tmp, (char *) oldaction);
if (current->sigaction[signum - 1].sa_flags & SA_NOMASK)
current->sigaction[signum - 1].sa_mask = 0;
else
current->sigaction[signum - 1].sa_mask |= (1 << (signum - 1));
return 0;
}
void do_signal ()
{
unsigned long cur_signal = 0,cur_blocked = 0,allow_signal = 0,mask_signal = 1,signr = 0;
void (*sa_handler)(int);
struct sigaction *sa = 0;
int longs;
unsigned long *tmp_esp;
int i;
if(current == task[0])
return;
cur_signal = current->signal;
cur_blocked = current->blocked;
allow_signal = cur_signal&(~cur_blocked);
for(i = 0;i<32;i++){
if(mask_signal&allow_signal){
current->signal &= ~mask_signal;//reset the signal
signr = i+1;
break;
}
mask_signal <<= 1;
}
if(i == 32)
return;
sa = current->sigaction + signr - 1; //current->sigaction[signu-1]
sa_handler = sa->sa_handler;
if ((unsigned long)sa_handler == 1)
return;
if (!(unsigned long)sa_handler)
{
if (signr == SIGCHLD)
return;
else
do_exit (1 << signr);
}
if (sa->sa_flags & SA_ONESHOT)
sa->sa_handler = NULL;
current->blocked |= sa->sa_mask;
sa_handler(signr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -