Chinaunix首页 | 论坛 | 博客
  • 博客访问: 448204
  • 博文数量: 72
  • 博客积分: 1851
  • 博客等级: 上尉
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-16 17:50
文章分类

全部博文(72)

文章存档

2013年(1)

2012年(17)

2011年(51)

2010年(3)

分类: LINUX

2011-11-02 08:16:10

linux进程的描述中,task_struct结构体中存在下面的信号域:

  1. struct task_struct {
  2. .
  3. struct signal_struct *signal;//该进程的信号描述符指针
  4. struct sighand_struct *sighand;//信号处理程序描述符
  5. sigset_t blocked,real_blocked;//被阻塞信号的掩码,临时掩码
  6. sigset_t saved_sigmask;//
  7. struct sigpending pending;//私有信号挂起队列
  8. unsigned long sas_ss_sp;//信号处理程序备用栈地址
  9. size_t sas_ss_size;//信号处理程序备用栈大小
  10. int (*notifier)(void *priv);//指向一个函数指针,设备驱动程序用该函数阻塞进程的某些信号
  11. void *notifier_data;//处理函数的形参
  12. sigset_t *notifier_mask;//设备驱动程序通过notifier函数所阻塞的信号位掩码
  13. ..
  14. }
  15. sigset_t定义如下:
  16. typedef struct {
  17.     unsigned long sig[2];
  18. }sigset_t

信号编号中1~31为非实时信号31~64为实时信号(通过kill -l 来查看系统中的所有信号),当系统创建的是线程时就会进行共享,其中的部分函数代码如下:

  1. static int copy_signal(unsigned long clone_flags,struct task_struct *tsk)
  2. {
  3.     struct signal_struct *sig;
  4.     int ret;
  5.     if(clone_flags & CLONE_THREAD) {
  6.         atomic_inc(&current->signal->count);
  7.         atomic_inc(&current->signal->live);
  8.         return 0;
  9.     }
  10.     …......
  11. }

struct signal_struct 结构体的定义如下:

  1. struct signal_struct {
  2.     atomic_t count;//信号描述符的使用计数器
  3.     atomic_t live;//线程组中的活动进程数量
  4.     wait_queue_head_t wait_chldexit;//wait4()中睡眠的进程等待队列
  5.     struct task_struct *curr_target;//接收信号的线程组中最后一个进程的描述符
  6.     struct sigpending shared_pending;//存放共享挂起信号的数据结构
  7.     int group_exit_code;//线程组的进程终止代码
  8.     struct task_struct *group_exit_task;//杀死整个线程组
  9.     int notify_count;//杀死整个线程组时使用
  10.     int group_stop_count;//停止整个线程组
  11.     unsigned int flags;//在传递修改进程状态的信号使用的标志
  12.     …......
  13. };

信号处理函数

  1. struct sighand_struct {
  2.     atomic_t count;
  3.     struct k_sigaction action[64];//与信号的个数保持一致
  4.     spinlock_t siglock;//保护信号描述符和信号处理程序描述符的自旋锁
  5.     wait_queue_head_t signalfd_wqh;
  6. };

struct k_sigaction的原型如下:

  1. struct k_sigaction {
  2.     struct sigaction sa;
  3. }
  4. struct sigaction{
  5.     __sighandler_t sa_handler;//处理函数指针或SIG_DFL或SIG_IGN
  6.     unsigned long sa_flags;//处理信号的标志
  7.     __sigrestore_t sa_restorer;//目前已不再使用
  8.     sigset_t mask;//当前信号处理程序时要屏蔽的信号
  9. }

挂起信号队列为:

  1. struct sigpending {
  2.     struct list_head list;
  3.     sigset_t signal;
  4. }

一共有两条信号挂起队列:公有信号挂起队列和私有信号挂起队列,实时信号排队的数据结构如下:

  1. struct sigqueue
  2. {
  3.     struct list_head list;
  4.     int flags;//sigqueue数据结构标志
  5.     siginfo_t info;//产生信号的事件
  6.     struct user_struct *user;//与信号相关进程的用户信息
  7.     si_signo;//信号编号
  8.     si_errno;//引起信号产生的指令出错码
  9.     si_code;//发送信号者的代码
  10. }

同样当创建线程时也会共享线程处理函数:

  1. .
  2. if(clone_flags & (CLONE_SIGHAND | CLONE_THREAD)) {
  3.     atomic_inc(&current->sighand->count);
  4.     return 0;
  5. }
  6. ..

阅读(1522) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~