1.在系统中什么是信号,都有什么信号
2.在系统接收到信号后,他是如何处理的
3.信号作用
信号处理流程:
_system_call:
call _sys_call_table(,%eax,4)
sys_signal
sys_signal
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;
}
do_signal函数
void do_signal(long signr,long eax, long ebx, long ecx, long edx,
long fs, long es, long ds,
long eip, long cs, long eflags,
unsigned long * esp, long ss)
{
unsigned long sa_handler;
long old_eip=eip;
struct sigaction * sa = current->sigaction + signr - 1;
int longs;
unsigned long * tmp_esp;
sa_handler = (unsigned long) sa->sa_handler;
/*
mark #define SIG_DFL ((void (*)(int))0) default signal handling
mark #define SIG_IGN ((void (*)(int))1) ignore signal
*/
if (sa_handler==1)
return;
if (!sa_handler) {
if (signr==SIGCHLD)
return;
else
do_exit(1<<(signr-1));
}
if (sa->sa_flags & SA_ONESHOT)
sa->sa_handler = NULL;
*(&eip) = sa_handler;
longs = (sa->sa_flags & SA_NOMASK)?7:8;
*(&esp) -= longs;
verify_area(esp,longs*4);
tmp_esp=esp;
put_fs_long((long) sa->sa_restorer,tmp_esp++);
put_fs_long(signr,tmp_esp++);
if (!(sa->sa_flags & SA_NOMASK))
put_fs_long(current->blocked,tmp_esp++);
put_fs_long(eax,tmp_esp++);
put_fs_long(ecx,tmp_esp++);
put_fs_long(edx,tmp_esp++);
put_fs_long(eflags,tmp_esp++);
put_fs_long(old_eip,tmp_esp++);
current->blocked |= sa->sa_mask;
}
主要作用: