继续分析这个额exit.c的文件,这次看一个比较简单的函数,send_sig。 这是一个内联函数,也是一个静态的函数。应该是考虑了效率以及访问的保护。这个函数大概看一下,基本上是一个信号的状态修改动作接口。 这个函数里面考虑了一些简单,比如说信号的忽略检查。其中应该有两个信号,涉及到任务的停止切换,比较特殊。 这个...
send_sig_info() 首先调用 bad_signal() 函数来检查是否有权发送信号给进程,然后调用 ignored_signal() 函数来检查信号是否被忽略,接着调用 deliver_signal() 函数开始发送信号,最后如果进程是睡眠状态就唤醒进程。我们接着来分析 deliver_signal() 函数: static int deliver_signal(int sig, struct siginfo *info...
(2)函数send_signal 这个函数主要做了3件事情: 构造一个信号结构体变量:struct siginfo info; 通过应用程序传入的 PID,获取任务信息:pid_task(find_vpid(g_pid), PIDTYPE_PID); 发送信号:send_sig_info(sig_no, &info, my_task); 驱动模块 Makefile $touchMakefile 内容如下: ifneq($(KERNELRELEASE),)...
接收参数:信号sig,数据结构siginfo_t中info的地址(或具体编码值,参考前面的specific_send_sig_info()描述,目标进程描述符地址t,挂起信号队列signals的地址。 函数执行如下内容: 如果info等于2,信号是SIGKILL或SIGSTOP且是内核通过force_sig_specific()函数产生的:这种情况直接跳转到第9步。与这些信号相对应的动作由内...
$ ./sig loop this thread:1 signal func:11, this thread:1 可以看到信号的运行线程和loop的线程是同一个。 然后我们在命令行中向该程序发送11的信号: $ kill -11 `pidof sig` 然后看下打印的函数调用栈: 0# doSignal(int) in ./sig 1# 0x00007FAAB4C0A090 in /lib/x86_64-linux-gnu/libc.so...
这个示例,我们使用了sigaction系统调用来实现信号处理。用户态应用程序通过sigaction系统调用注册信号处理函数,当接收到信号时,信号处理函数将被调用。内核态驱动程序通过send_sig_info函数发送信号,用户态应用程序接收到信号后,信号处理函数将打印数据。共享内存(Share Memory)这个示例,提供一个简单的C语言实现,用于在用户...
(2)函数 send_signal 这个函数主要做了3件事情: 构造一个信号结构体变量:struct siginfo info; 通过应用程序传入的 PID,获取任务信息:pid_task(find_vpid(g_pid), PIDTYPE_PID); 发送信号:send_sig_info(sig_no, &info, my_task); ...
send_signal 首先调用 kmem_cache_alloc 函数来申请一个类型为 struct sigqueue 的队列节点,然后把节点添加到 pending 队列中,接着根据参数 info …
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))) { ...
\n");return;}// 发送信号ret=send_sig_info(sig_no,&info,my_task);if(ret<0){printk("send signal failed! \n");}}//中断处理函数staticirqreturn_tmyirq_handler(int irq,void*dev){struct myirq mydev;unsigned char key_code;mydev=*(struct myirq*)dev;// 检查设备 id,只有当相等的时候才...