linux c不阻塞运行cmd,Linux的字符设备驱动程序:阻塞ioctl调用

我是新驱动程序的开发,我试图写出具有读写控制,允许用户进程得到我的字符设备驱动程序承担了最后一次读取的时间(的timespec)一个简单的字符设备驱动程序写。 - Linux的字符设备驱动程序:阻塞ioctl调用

long charmem_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {

struct charmem_dev *dev = filp->private_data;

if (down_interruptible(&dev->sem)) {

printk(KERN_WARNING "I got booted!!\n");

return -ERESTARTSYS;

}

printk(KERN_WARNING "charmem: in ioctl; cmd = %d, arg = %d\n", (int)cmd, (int)arg);

switch(cmd) {

case IOCTL_GET_LAST_READ_TIME:

printk("charmem_ioctl: returning last read time delta, exiting...\n");

up(&dev->sem);

return dev->last_read_delta.tv_nsec;

break;

case IOCTL_GET_LAST_WRITE_TIME:

printk("charmem_ioctl: returning last write time delta, exiting...\n");

up(&dev->sem);

return dev->last_write_delta.tv_nsec;

break;

case IOCTL_RESET_READ: /*return read-pointer to the start of buffer*/

dev->rp = dev->buffer;

break;

case IOCTL_RESET_WRITE: /*return write-pointer to the start of buffer*/

dev->wp = dev->buffer;

break;

case IOCTL_LOAD_BUFFER_TO_CACHE:

load_buffer_to_cache(dev->buffer, dev->buffer_size);

break;

default:

printk("charmem_ioctl: invalid ioctl command, exiting...\n");

up(&dev->sem);

return -EFAULT;

}

up(&dev->sem);

return 0;

}

struct file_operations charmem_fops = {

.owner = THIS_MODULE,

.llseek = no_llseek,

.read = charmem_read,

.write = charmem_write,

.unlocked_ioctl = charmem_ioctl,

.open = charmem_open,

.release = charmem_release,

};

main.c,测试我的字符设备用户程序:

int fd = 0, ret = 0;

fd = open("/dev/charmem0", O_RDWR);

if (fd < 0) {

printf("/dev/charmem0 unable to access (fd = %d)... EXITING\n", fd);

return -1;

}

ret = write(fd,msg1,10);

ret = read(fd,user_buffer,10);

read_delta = ioctl(fd, IOCTL_GET_LAST_READ_TIME);

printf("read_delta : %d\n ", read_delta);

write_delta = ioctl(fd, IOCTL_GET_LAST_WRITE_TIME);

printf("write_delta : %d\n ", write_delta);

main.c是测试我的炭设备中的程序;程序在打印出read_delta值后会阻止,并且我假定它在ioctl上阻塞。我在代码中做错了什么?

+0

是什么让你觉得什么是错的(注:?你不应该返回EFAULT,但在ENOTTY默认情况下)。 –

2012-02-24 07:53:48

+0

你怎么在内核日志中看到,当你运行你的计划吗?当你的用户空间程序被阻止,这是什么的/ proc//堆栈显示(其中“”被阻塞的PID号替换使用您的ioctl) –

2012-02-25 06:01:33

+0

过程?你在dmesg的看见了什么?你能CTRL-C,当它杀块的程序? –

2012-03-15 13:17:42

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值