【问题标题】:Driver function won't execute in c, but others will驱动程序函数不会在 c 中执行,但其他函数会
【发布时间】:2018-10-04 05:04:03
【问题描述】:

我正在制作设备驱动程序。我添加了与 read 和 llseek 最相关的代码。我可以很好地输入和使用 read 。但是由于某种原因, llseek 无法进入。我在文件操作中将它列为 llseek 并将其与我想要的函数相匹配,参数似乎不错?

在 dmesg 中,我得到“inside READ”,但没有“inside SEEK”,也没有错误。终端或编译期间也没有错误。我也不太了解c。

主要

int file = open("/dev/simple_char_driver", O_RDWR);

//read example, this works fine
printf("Enter how many bytes you want to read: \n");
int len[10];
scanf("%d", len);
char *ptr = malloc(*len * sizeof(char));

read(file, ptr, *len);

//llseek example, doesn't enter
int offset [10];
int whence [10];
scanf("%d",offset);
printf("Enter a value for whence: \n");
scanf("%d",whence);

llseek(file, offset, whence); 

在我的设备驱动程序中:

loff_t simple_char_driver_seek (struct file *pfile, loff_t offset, int whence)
{
    printk(KERN_ALERT "Inside SEEK");
    return 0;
}

ssize_t simple_char_driver_read (struct file *pfile, char __user *buffer, size_t length, loff_t *offset)
{
    printk(KERN_ALERT "Inside READ");
    return 0;
}

struct file_operations simple_char_driver_file_operations = {

    .owner   = THIS_MODULE,
    .open    = simple_char_driver_open,
    .release = simple_char_driver_close,
    .read    = simple_char_driver_read,
    .write   = simple_char_driver_write,
    .llseek  = simple_char_driver_seek,
};

【问题讨论】:

  • 我对内核驱动程序生疏了,但这可能只是在您的 printk 调用结束时缺少 '\n' 的情况吗?你试过用 strace 调试吗?
  • 另外,我假设 simple_char_driver_read 和 simple_char_driver_seek 有返回语句?
  • 是的,有return语句,我取出了很多代码来简化它。我将添加返回语句,但它们带有框架代码,可能不是问题。我也在想办法调试。
  • 你是对的,如果你有骨架返回语句,它们不太可能是问题。我记得在 printk 下缓冲是不直观的,所以也许尝试一些额外的新行('\n'),甚至额外的 printk 语句来强制刷新会有所帮助。在 strace (man strace) 下运行会跟踪系统调用和信号,因此它可能会帮助您了解发生了什么。

标签: c linux-kernel


【解决方案1】:

关于您的第二个问题:
printk 是行缓冲的。这意味着缓冲区将在遇到换行符 (\n) 时被刷新(内容将被发送到日志文件)。否则,只有在程序退出时才会执行。
因此,请在您的 printk 语句中使用 '\n'。

【讨论】:

  • 我刚刚添加了 \n 到所有这些,它仍然没有达到 llseek
  • scanf读入whence后能打印出来吗?
  • 哦,我忘记了那些变量仍然是指针,它们应该作为 *offset 和 *whence 发送。当然,这两个变量是我最终没有打印出来的唯一东西。它有效。
猜你喜欢
  • 1970-01-01
  • 2019-11-25
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多