当前位置: 技术问答>linux和unix
内核模块编程,kill进程时死机
来源: 互联网 发布时间:2016-11-02
本文导语: 我在内核模块里面定义读操作 static ssize_t read(struct file *filp,char __user *buf,size_t count,loff_t *offp) { int ret; int i; if(!readable)//没有数据,但是它还是被读,要让进程再睡眠,为什么用if?不用while? { //假如用while,将...
我在内核模块里面定义读操作
static ssize_t read(struct file *filp,char __user *buf,size_t count,loff_t *offp)
{
int ret;
int i;
if(!readable)//没有数据,但是它还是被读,要让进程再睡眠,为什么用if?不用while?
{ //假如用while,将会无法停止调用,造成死机现象
if(filp->f_flags & O_NONBLOCK)
return -EAGAIN;
wait_event_interruptible(button_queue,readable);
}
...省略
然后我的应用程序里面是先用select再读,我发现上面注释的问题
就是用了while后会死机,报错为,not tainted
请问这是什么问题?我在终端里面用kill,它杀死进程的流程大概是怎样?
为什么不应该用while,我的理解是:你读的时候没数据,就阻塞,但是有时候被错误唤醒,还是没数据,不应该是再阻塞吗?
这里面有一个疑问:
进程唤醒后是从哪里面执行下去的?不是从wait_event_interruptible(button_queue,readable);
这语句往下执行吗?
求真相。。谢谢
static ssize_t read(struct file *filp,char __user *buf,size_t count,loff_t *offp)
{
int ret;
int i;
if(!readable)//没有数据,但是它还是被读,要让进程再睡眠,为什么用if?不用while?
{ //假如用while,将会无法停止调用,造成死机现象
if(filp->f_flags & O_NONBLOCK)
return -EAGAIN;
wait_event_interruptible(button_queue,readable);
}
...省略
然后我的应用程序里面是先用select再读,我发现上面注释的问题
就是用了while后会死机,报错为,not tainted
请问这是什么问题?我在终端里面用kill,它杀死进程的流程大概是怎样?
为什么不应该用while,我的理解是:你读的时候没数据,就阻塞,但是有时候被错误唤醒,还是没数据,不应该是再阻塞吗?
这里面有一个疑问:
进程唤醒后是从哪里面执行下去的?不是从wait_event_interruptible(button_queue,readable);
这语句往下执行吗?
求真相。。谢谢
|
调用 wait_event_interruptible(button_queue,readable); 已经让进程进行休眠了,当你在终端用 kill 唤醒该进程后,进程从 if(!readable) 里面跳出来继续执行,
但是你如果用了while(!readable),当用kill唤醒进程后,如果没有数据,进程还是继续调用wait_event_interruptible(button_queue,readable); 进行休眠。
你在驱动程序里面应该设计,如果数据可读了,你应该唤醒该进程,即这时会从 if(!readable) 里面的语句跳出来执行其他代码。
但是你如果用了while(!readable),当用kill唤醒进程后,如果没有数据,进程还是继续调用wait_event_interruptible(button_queue,readable); 进行休眠。
你在驱动程序里面应该设计,如果数据可读了,你应该唤醒该进程,即这时会从 if(!readable) 里面的语句跳出来执行其他代码。
|
kill通过发送SIGKILL这一信号给进程来终止。可以参考,http://blog.sina.com.cn/s/blog_4beb8c75010009by.html
|
我也想知道答案,帮你顶下!!!!!