继续分析这个额exit.c的文件,这次看一个比较简单的函数,send_sig。 这是一个内联函数,也是一个静态的函数。应该是考虑了效率以及访问的保护。这个函数大概看一下,基本上是一个信号的状态修改动作接口。 这个函数里面考虑了一些简单,比如说信号的忽略检查。其中应该有两个信号,涉及到任务的停止切换,比较特殊。 这个...
接收参数:信号sig,数据结构siginfo_t中info的地址(或具体编码值,参考前面的specific_send_sig_info()描述,目标进程描述符地址t,挂起信号队列signals的地址。 函数执行如下内容: 如果info等于2,信号是SIGKILL或SIGSTOP且是内核通过force_sig_specific()函数产生的:这种情况直接跳转到第9步。与这些信号相对应的动作由内...
其中ngx_init_signals 函数就是将默认的信号处理回调函数注册到相应的信号: ngx_int_tngx_init_signals(ngx_log_t*log){ngx_signal_t*sig;structsigactionsa;for(sig=signals;sig->signo!=0;sig++){ngx_memzero(&sa,sizeof(structsigaction));if(sig->handler){sa.sa_sigaction=sig->handler;sa.sa_f...
需要调用函数 copy_from_user(&g_pid, pArg, sizeof(int)),把用户空间的参数复制到内核空间中; 成功取得PID之后,就调用函数send_signal向应用程序发送信号。 这里仅仅是用于演示目的,在实际的项目中,可能会根据接收到硬件触发之后再发送信号。 (2)函数send_signal 这个函数主要做了3件事情: 构造一个信号结构体...
}intmain(void){intcount =0;// 注册信号处理函数structsigactionsa;sigemptyset(&sa.sa_mask); sa.sa_sigaction = &signal_handler; sa.sa_flags = SA_SIGINFO;sigaction(SIGUSR1, &sa,NULL);sigaction(SIGUSR2, &sa,NULL);// 一直循环打印信息,等待接收发信号while(1) ...
首先调用sig_ignored检查信号是否被忽略,然后检查发送的信号是不是普通信号,如果是普通信号,就需要根据信号位图来检查当前信号队列中是否已经存在该信号,如果已经存在,对于普通信号不需要做任何处理。然后调用send_signal来完成实际的发送工作,send_signal()是信号发送的重点,除sys_tkill之外的函数,最终都是通过send_sig...
ret = send_sig_info(sig_no, &info, my_task); if (ret < 0) { printk("send signal failed! \n"); } } //中断处理函数 static irqreturn_t myirq_handler(int irq, void * dev) { struct myirq mydev; unsigned char key_code;
send_signal 首先调用 kmem_cache_alloc 函数来申请一个类型为 struct sigqueue 的队列节点,然后把节点添加到 pending 队列中,接着根据参数 info …
忽略(Ignore)信号:一个信号的处理函数可以被设置为SIG_IGN。这相当于一个空函数,表示直接忽略该信号,不做任何处理。 默认信号处理函数:一个信号的处理函数可以被设置为SIG_DFL。表示选用系统默认的信号处理函数。 数据结构 要深入分析Signal机制,需要先了解下面的数据结构。
send_sig(SIGPIPE, current, 1); return (-EPIPE); } return (-EINVAL); } //1 拿到接收端的unix buffer,直接写入数据 pupd = UN_DATA(sock)->peerupd; /* safer than sock->conn */ //2 如果已经写满,就直接阻塞 while (!(space = UN_BUF_SPACE(pupd))) { ...