gpt4 book ai didi

c - 如果 cmd = 2,则不调用 ioctl

转载 作者:太空狗 更新时间:2023-10-29 16:44:28 25 4
gpt4 key购买 nike

我正在开发一个使用 unlocked_ioctl 的内核模块。我使用内核版本 2.6.24-23-generic 对其进行了测试,它运行良好。现在我用内核版本 3.3.1-1-ARCH 尝试了它,但发生了一些奇怪的事情:当请求值(cmd)为 2 时,ioctl 函数没有被执行。它返回 0,但函数没有被执行。为了检查它是否未执行,我执行了以下操作:

static long midriver_ioctl(struct file *file,
unsigned int cmd, unsigned long arg) {

printk("Called with cmd = %d\n", cmd);

我编写了一个测试程序,从 0 到 4096 为这个设备调用 ioctl,我可以在 dmesg 中看到所有这些值的消息“Called with cmd = n”,除了“2”,唯一一个是未显示。

关于我做错了什么的任何线索?

提前谢谢你,

最佳答案

看看 this :

 546 int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
547 unsigned long arg)
548 {
549 int error = 0;
550 int __user *argp = (int __user *)arg;
551 struct inode *inode = filp->f_path.dentry->d_inode;
552
553 switch (cmd) {
554 case FIOCLEX:
555 set_close_on_exec(fd, 1);
556 break;
557
558 case FIONCLEX:
559 set_close_on_exec(fd, 0);
560 break;
561
562 case FIONBIO:
563 error = ioctl_fionbio(filp, argp);
564 break;
565
566 case FIOASYNC:
567 error = ioctl_fioasync(fd, filp, argp);
568 break;
569
570 case FIOQSIZE:
571 if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode) ||
572 S_ISLNK(inode->i_mode)) {
573 loff_t res = inode_get_bytes(inode);
574 error = copy_to_user(argp, &res, sizeof(res)) ?
575 -EFAULT : 0;
576 } else
577 error = -ENOTTY;
578 break;
579
580 case FIFREEZE:
581 error = ioctl_fsfreeze(filp);
582 break;
583
584 case FITHAW:
585 error = ioctl_fsthaw(filp);
586 break;
587
588 case FS_IOC_FIEMAP:
589 return ioctl_fiemap(filp, arg);
590
591 case FIGETBSZ:
592 return put_user(inode->i_sb->s_blocksize, argp);
593
594 default:
595 if (S_ISREG(inode->i_mode))
596 error = file_ioctl(filp, cmd, arg);
597 else
598 error = vfs_ioctl(filp, cmd, arg);
599 break;
600 }
601 return error;
602

如您所见,在 vfs_ioctlfile_ioctl 调用之前有一些 switch-case。

关于c - 如果 cmd = 2,则不调用 ioctl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10071296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com