继续分析这个额exit.c的文件,这次看一个比较简单的函数,send_sig。 这是一个内联函数,也是一个静态的函数。应该是考虑了效率以及访问的保护。这个函数大概看一下,基本上是一个信号的状态修改动作接口。 这个函数里面考虑了一些简单,比如说信号的忽略检查。其中应该有两个信号,涉及到任务的停止切换,比较特殊。 这个...
send_sig_info() 首先调用 bad_signal() 函数来检查是否有权发送信号给进程,然后调用 ignored_signal() 函数来检查信号是否被忽略,接着调用 deliver_signal() 函数开始发送信号,最后如果进程是睡眠状态就唤醒进程。我们接着来分析 deliver_signal() 函数: ...
\n", g_pid);return;}printk("send signal %d to pid %d \n", sig_no, g_pid);// 构造信号结构体memset(&info, 0, sizeof(struct siginfo));
bpf_send_signal() | 在我们的情况下,在 __send_signal_locked 中:sig 是 SIGKILL,info 是 SEND_SIG_PRIV,t 是当前任务(正在运行的线程),type 是 PIDTYPE_TGID,force 为 true,当 info 为 SEND_SIG_PRIV 时总是设置为 true,这意味着这是一个源自内核而非用户程序的信号。 static int __send_signal_l...
首先调用sig_ignored检查信号是否被忽略,然后检查发送的信号是不是普通信号,如果是普通信号,就需要根据信号位图来检查当前信号队列中是否已经存在该信号,如果已经存在,对于普通信号不需要做任何处理。然后调用send_signal来完成实际的发送工作,send_signal()是信号发送的重点,除sys_tkill之外的函数,最终都是通过send_signal...
}// 发送信号ret =send_sig_info(sig_no, &info, my_task);if(ret <0) {printk("send signal failed! \n"); } }//中断处理函数staticirqreturn_tmyirq_handler(intirq,void* dev){structmyirqmydev;unsignedcharkey_code; mydev = *(structmyirq*)dev;// 检查设备 id,只有当相等的时候才需要处理...
}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) ...
send_signal 首先调用 kmem_cache_alloc 函数来申请一个类型为 struct sigqueue 的队列节点,然后把节点添加到 pending 队列中,接着根据参数 info …
5.2.2 send_signal函数 这个函数主要做了3件事情: 1. 构造一个信号结构体变量:struct siginfo info; 2. 通过应用程序PID,获取任务信息:pid_task(find_vpid(g_pid), PIDTYPE_PID); 3. 给应用进程发送信号:send_sig_info(sig_no, &info, my_task); ...