LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 799|回复: 5

Linux对信号的处理问题

[复制链接]
发表于 2007-6-28 19:27:23 | 显示全部楼层 |阅读模式
如果系统或用户向一个进程发送了信号,进程执行用户定义的信号处理函数时,是阻塞主线程(主线程未屏蔽此信号)重新开启一个线程执行信号处理函数,还是相当于直接调用普通函数一样直接调用信号处理函数?还是其他的处理方法?
发表于 2007-6-28 20:21:39 | 显示全部楼层
这个不是系统的问题吧,如何处理信号是程序本身的事情
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-28 21:56:29 | 显示全部楼层
在信号处理函数中检查了pid,和main中的pid对比了一下是一样的,说明系统没有为信号处理函数专门开启一个线程。
但是信号处理函数的堆栈在什么地方呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-28 21:56:50 | 显示全部楼层
在信号处理函数中检查了pid,和main中的pid对比了一下是一样的,说明系统没有为信号处理函数专门开启一个线程。
但是信号处理函数的堆栈在什么地方呢?
回复 支持 反对

使用道具 举报

发表于 2007-6-29 02:11:19 | 显示全部楼层
是你啊,呵呵,是这样的,如果想在有信号发生并被处理的时候不耽误做其他的事情,一般可以用fork或者pthread_create,但你这种情况应该是单线程了,这种情况下,收到信号时你现在做的工作马上暂停,然后跳转到信号处理函数,然后再跳回来,并恢复运行环境。至于堆栈,既然是单线程,信号处理程序当然没有自己的堆栈了,另外线程之间也共用一个地址空间
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-29 03:14:57 | 显示全部楼层
信号处理函数也有自己的栈。原来执行信号处理程序前把原来的进程的context存到内核的一个数据结构里了。restore的时候再拷出来。恢复寄存器的值。
/* Set up registers for signal handler */
regs->esp = (unsigned long) frame;
regs->eip = (unsigned long) ka->sa.sa_handler;
regs->eax = (unsigned long) usig;
regs->edx = (unsigned long) &frame->info;
regs->ecx = (unsigned long) &frame->uc;

set_fs(USER_DS);
regs->xds = __USER_DS;
regs->xes = __USER_DS;
regs->xss = __USER_DS;
regs->xcs = __USER_CS;
...........
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表