我正在Linux上测试一些软件+驱动程序,驱动程序在其内部函数中使用get_user_pages()。在某个时候,我的驱动程序从get_user_pages()中收到ERESTARTSYS错误(-512),根据内核代码,这是因为“如果我们有一个挂起的SIGKILL,不要继续错误页面和潜在的分配内存。”-这是来自memory.c内核文件的注解。我怎么能看到谁发送了这个SIGKILL,为什么?我试图在/var/log/kern. log文件中查找,但没有看到任何信号。
l7wslrjt1#
我不相信你可以为SIGKILL(其他人,是的),除非你愿意打补丁给内核给予你信号信息。在这种情况下,你可以检查si_code和si_pid的值,根据文档:http://pubs.opengroup.org/onlinepubs/009696699/basedefs/signal.h.html例如,如果您的信号信息在siptr中:
if ((siptr)->si_code <= 0) { printk(KERN_DEBUG "kill sent by process %u", (siptr)->si_pid); }
if检查不是绝对必要的:它将printk()限制为kill()引发的那些信号。如果内核引发了该信号,si_code将大于0。
rggaifut2#
我也遇到了同样的问题,但是我会从sock_sendmsg()中得到-ERESTARTSYS,而不是在get_user_pages()中。为了调试这个问题,我在linux-3.2/kernel/signal.c中添加了一条日志消息:__发送信号()。为了避免消息填充内核日志,我会strncmp(t-〉comm,“myprogramname”)然后记录t-〉comm,t-〉pid,current-〉comm和current-〉pid。此外,我意识到这不仅是SIGKILL,但任何其他信号挂起太多,然后调用将返回-ERESTARTSYS。所以我的下一步是找出是谁给了我的程序一个信号。并且为所有的信号添加处理程序(除了SIGKILL,我真的不能处理)。幸运的是它不是SIGKILL。添加处理程序可能对您的案例没有帮助,但日志记录将识别发送者和原因。处理可能会帮助其他有类似问题的人。
2条答案
按热度按时间l7wslrjt1#
我不相信你可以为SIGKILL(其他人,是的),除非你愿意打补丁给内核给予你信号信息。在这种情况下,你可以检查si_code和si_pid的值,根据文档:http://pubs.opengroup.org/onlinepubs/009696699/basedefs/signal.h.html
例如,如果您的信号信息在siptr中:
if检查不是绝对必要的:它将printk()限制为kill()引发的那些信号。如果内核引发了该信号,si_code将大于0。
rggaifut2#
我也遇到了同样的问题,但是我会从sock_sendmsg()中得到-ERESTARTSYS,而不是在get_user_pages()中。
为了调试这个问题,我在linux-3.2/kernel/signal.c中添加了一条日志消息:__发送信号()。
为了避免消息填充内核日志,我会strncmp(t-〉comm,“myprogramname”)然后记录t-〉comm,t-〉pid,current-〉comm和current-〉pid。
此外,我意识到这不仅是SIGKILL,但任何其他信号挂起太多,然后调用将返回-ERESTARTSYS。
所以我的下一步是找出是谁给了我的程序一个信号。并且为所有的信号添加处理程序(除了SIGKILL,我真的不能处理)。幸运的是它不是SIGKILL。
添加处理程序可能对您的案例没有帮助,但日志记录将识别发送者和原因。
处理可能会帮助其他有类似问题的人。