Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 当用户进程终止/接收到信号时,是否中断内核模块?_Linux Kernel_Signals_Interrupt_Kernel Module_Terminate - Fatal编程技术网

Linux kernel 当用户进程终止/接收到信号时,是否中断内核模块?

Linux kernel 当用户进程终止/接收到信号时,是否中断内核模块?,linux-kernel,signals,interrupt,kernel-module,terminate,Linux Kernel,Signals,Interrupt,Kernel Module,Terminate,我正在处理一个内核模块,我需要“意识到”给定进程已经崩溃 现在我的方法是在内核模块中设置一个定时中断;在每次计时器中断时,我检查该进程的task_struct.state和task_struct.exitstate值 我想知道是否有一种方法可以在内核模块中设置一个中断,当进程终止时,或者当进程接收到一个给定的信号(例如,SIGINT或SIGHUP)时,该中断会消失 谢谢 编辑:这里的一个问题是我不能修改用户应用程序。或者至少,如果我对其他供应商的s/w提出附加要求/约束,那么向客户销售会更加困难

我正在处理一个内核模块,我需要“意识到”给定进程已经崩溃

现在我的方法是在内核模块中设置一个定时中断;在每次计时器中断时,我检查该进程的task_struct.state和task_struct.exitstate值

我想知道是否有一种方法可以在内核模块中设置一个中断,当进程终止时,或者当进程接收到一个给定的信号(例如,SIGINT或SIGHUP)时,该中断会消失

谢谢


编辑:这里的一个问题是我不能修改用户应用程序。或者至少,如果我对其他供应商的s/w提出附加要求/约束,那么向客户销售会更加困难。

您可以让模块创建一个角色设备节点,然后从用户空间过程中打开该节点。在您的模块中注册一个简单的cdev只需要十几行样本。当流程打开设备节点时,将调用cdev的
open
方法;当设备节点关闭时,将调用
release
方法。如果进程有意退出或由于信号退出,内核将关闭所有打开的文件描述符。因此,您可以确定将调用
release
。这避免了轮询进程状态的任何需要,并且可以避免修改模块之外的任何内核代码

您还可以设置一个看门狗式的系统,在该系统中,您的进程必须每隔一段时间向设备写入一个字节。让cdev的
写入方法重置计时器。如果有太多的时间没有写入而计时器过期,则假定进程以某种方式失败,即使它没有崩溃和终止。例如,一个允许互斥锁死锁或将进程放入无限循环的编程错误


在内核代码中有一点是信号被传递给用户进程的。您可以对此进行修补,检查进程名称,并在条件变量匹配时发出信号。这将只是捕获信号,而不是有意的进程退出。嗯,这要难看得多,你需要处理维护内核补丁的问题。但这并不难,只有一点,我不记得是什么函数,抱歉,在这里可以插入必要的代码,它将捕获所有信号。

谢谢!这里有一个陷阱,我应该提到:我不能修改用户应用程序。或者至少,如果我对其他供应商的s/w提出额外要求/限制,那么向客户销售将更加困难。。。也许补丁方法是值得一看的,但我认为只有当周期性计时器中断导致的性能下降达到可接受阈值时,复杂性权衡才值得……是否有一个启动应用程序并向模块发送信号的包装器?如果子进程(应用程序进程)崩溃或退出,将通过
waitpid()
等通知进程的父进程(即包装器)。您甚至可以让包装器打开驱动程序的设备节点,然后执行应用程序,而无需关闭设备节点。子级将继承打开的文件描述符,并将其保持打开状态,直到关闭或终止。启动应用程序后,包装器不需要存在。