⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 signal.c

📁 msLinux v1.0 可以在arm ads 下仿真运行的linux
💻 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 + -