ioctrl原形 linux_ioctl如何知道在linux中调用哪个函数?

ioctl(2)通过fs / ioctl.c函数进入:

SYSCALL_DEFINE3(ioctl,unsigned int,fd,cmd,unsigned long,arg)

{

struct file *filp;

int error = -EBADF;

int fput_needed;

filp = fget_light(fd,&fput_needed);

if (!filp)

goto out;

error = security_file_ioctl(filp,arg);

if (error)

goto out_fput;

error = do_vfs_ioctl(filp,arg);

out_fput:

fput_light(filp,fput_needed);

out:

return error;

}

请注意,已经有一个文件描述符fd关联.内核然后调用fget_light()来查找一个filp(大致是文件指针,但是不要把它与标准的IO FILE *文件指针混淆).对security_file_ioctl()的调用检查加载的安全模块是否允许ioctl(无论是按照AppArmor和TOMOYO中的名称,还是按照SMACK和SELinux中的标签),以及用户是否具有正确的功能(功能(7))进行通话.如果调用被允许,那么调用do_vfs_ioctl()来处理常见的ioctl本身:

switch (cmd) {

case FIOCLEX:

set_close_on_exec(fd,1);

break;

/* ... */

如果没有一个常见的情况是正确的,那么内核调用一个helper例程:

static long vfs_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)

{

int error = -ENOTTY;

if (!filp->f_op || !filp->f_op->unlocked_ioctl)

goto out;

error = filp->f_op->unlocked_ioctl(filp,arg);

if (error == -ENOIOCTLCMD)

error = -EINVAL;

out:

return error;

}

驱动程序提供自己的.unlocked_ioctl函数指针,像fs / pipe.c中的这个管道实现:

const struct file_operations rdwr_pipefifo_fops = {

.llseek = no_llseek,.read = do_sync_read,.aio_read = pipe_read,.write = do_sync_write,.aio_write = pipe_write,.poll = pipe_poll,.unlocked_ioctl = pipe_ioctl,.open = pipe_rdwr_open,.release = pipe_rdwr_release,.fasync = pipe_rdwr_fasync,};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值