linux 0.11 源码学习(十)

signal

信号是进程间通信的一种形式,signal文件实现信号处理的注册,以及信号处理函数的回调。

信号在任务中的结构定义:

struct task_struct {

        //省略 

    struct sigaction sigaction[32]}



//定义在signal.h中

struct sigaction {

    void (*sa_handler)(int); //信号处理函数指针

    sigset_t sa_mask; //信号屏蔽码

    int sa_flags;

    void (*sa_restorer)(void); //信号恢复处理};

当前进程注册某个信号的处理,主要是sys_signal和sys_sigaction两个系统调用实现:

  • signal的系统调用,int sys_signal(int signum, long handler, long restorer),完成的工作主要是更新当前进程task_struct中的sigaction;
  • 改变进程收到某一信号的操作,sigaction()系统调用,int sys_sigaction(int signum, const struct sigaction * action,struct sigaction * oldaction),实现类似sys_signal。

信号处理函数do_signal,在system_call的ret_from_sys_call中被调用,ret_from_sys_call结束后会跳转到schedule。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)
  • 将信号处理函数指针赋值给eip;*(&eip) = sa_handler;

后面那一堆put_fs_long做什么用?和system_call的具体关系待完善!??

你可能感兴趣的:(linux)