- 论坛徽章:
- 0
|
假设进程A打开设备文件B,在B的驱动代码中持有mutex(mutex_lock, mutex_lock_interruptable),且正在访问设备。则此时在shell下用kill命令杀掉进程A时,好像不会立即生效,而是一直要等到驱动掉用了mutex_unlock后才会被kill掉。如果A一直不释放mutex的话,则永远不会被kill掉了。是不是有问题呀?
测试代码如下,以proc下的一个文件为例,读取时打开锁。
/*
# insmod mutex_debug.ko taskTime=10
# cat /proc/mutex_test
# kill pid_of_cat
*/
#include <linux/module.h>
#include <linux/version.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/moduleparam.h>
#include <asm/param.h>
#include <linux/uaccess.h>
#include <linux/string.h>
#include <linux/mutex.h>
#include <linux/timer.h>
/* Module Argument */
static int taskTime = 5;
module_param(taskTime, int, S_IRUGO);
MODULE_PARM_DESC(taskTime, "task running time, default is 5");
#define MUTEX_TEST_FILE "mutex_test"
struct mutex gMutexLock;
#define printk_dbg(format, arg...) \
do{ \
printk("%s:[cpu=%d, pid=%04d] " format, MUTEX_TEST_FILE, smp_processor_id(), current->pid, ##arg ); \
}while(0)
//////////////////////////////////////////////////////////////////////////////////////
// 生成一个执行N秒的任务
static void foo(int seconds)
{
unsigned long timeout = jiffies + HZ*seconds;
unsigned long cur_time=0;
int i=0;
printk_dbg("i=%d, timeout=%u, jiffies=%u.\n", i++, timeout, jiffies);
do{
// printk_dbg("i=%d, timeout=%u, jiffies=%u.\n", i++, timeout, jiffies);
// printk_dbg("goto sleep.\n");
// udelay(500*1000);
// delay(500);
// printk_dbg("wake up.\n");
}while(jiffies<timeout);
}
static int mutex_test_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{
printk_dbg("========== try to get mutext...\n");
mutex_lock_interruptible(&gMutexLock);
printk_dbg("---------- has got mutext.\n");
foo(taskTime); // work task
printk_dbg("---------- try to release mutext...\n");
mutex_unlock(&gMutexLock);
printk_dbg("========== has released mutext.\n\n");
{
int len;
if (off > 0) {
*eof = 1;
return 0;
}
len = sprintf(page, "taskTime=%d.\n\n", taskTime);
return len;
}
}
ssize_t mutex_test_write( struct file *filp, const char __user *buff, unsigned long len, void *data )
{
char buf[10]={0};
printk_dbg( "Readonly file.\n");
if (copy_from_user(buf, buff, 2))
{
return -EFAULT;
}
return len;
}
//////////////////////////////////////////////////////////////////////////////////////
static int __init test_module_init(void)
{
struct proc_dir_entry *mutex_test_dbg = NULL;
mutex_init(&gMutexLock);
mutex_test_dbg = create_proc_entry(MUTEX_TEST_FILE, 0666, NULL);
if (!mutex_test_dbg)
{
printk_dbg( "Failed to creat /proc/%s!\n", MUTEX_TEST_FILE);
return -1;
}
else
{
mutex_test_dbg->read_proc = mutex_test_read;
mutex_test_dbg->write_proc = mutex_test_write;
printk_dbg("/proc/%s created succeed.\n", MUTEX_TEST_FILE);
}
return 0;
}
static void __exit test_module_exit(void)
{
remove_proc_entry(MUTEX_TEST_FILE, NULL);
printk_dbg("/proc/%s removed.\n", MUTEX_TEST_FILE);
return ;
}
module_init(test_module_init);
module_exit(test_module_exit);
MODULE_VERSION("1.0");
MODULE_LICENSE("GPL");
不知道是不是本测试方法不对,各位有踫到过此问题吗? |
|