gpt4 book ai didi

c - ioctl - 无效参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:23 27 4
gpt4 key购买 nike

我有

#define IOCTL_ALLOC_MSG _IO(MAJOR_NUM, 0) 
#define IOCTL_DEALLOC_MSG _IO(MAJOR_NUM, 1)

在头文件中。

在我写的驱动文件中:

struct file_operations memory_fops = {
unlocked_ioctl: device_ioctl,
open: memory_open,
release: memory_release
};


int memory_init(void) {
int result;

/* Registering device */
result = register_chrdev(MAJOR_NUM, "memory", &memory_fops);
if (result < 0) {
printk("<1>memory: cannot obtain major number %d\n", MAJOR_NUM);
return result;
}

allocfunc();

printk("<1>Inserting memory module\n");
return 0;

}

int device_ioctl(struct inode *inode, /* see include/linux/fs.h */
struct file *file, /* ditto */
unsigned int ioctl_num, /* number and param for ioctl */
unsigned long ioctl_param)
{
/*
* Switch according to the ioctl called
*/
printk ( "<l> inside ioctl \n" );
switch (ioctl_num) {
case IOCTL_ALLOC_MSG:
allocfunc();
break;
case IOCTL_DEALLOC_MSG:
deallocfunc();
break;
}

return 0;
}

我创建了这样的角色文件

mknod /dev/memory c 60 0

应用调用失败

int main(int argc, char *argv[]) {
FILE * memfile;

/* Opening the device parlelport */
memfile=fopen("memory","r+");
if ( memfile <0) {
printf ( " cant open file \n");
return -1;
}

/* We remove the buffer from the file i/o */
int ret_val;
if ( argc > 1 ) {
if ( strcmp (argv[1], "mem" ) ==0 ) {


ret_val = ioctl(memfile, IOCTL_ALLOC_MSG);

if (ret_val < 0) {
printf("ioctl failed. Return code: %d, meaning: %s\n", ret_val, strerror(errno));
return -1;
}
}

当我运行该应用程序时,我在 strerror(errno) 中收到“ioctl 失败。返回代码:-1,意思是:无效参数”

打印:

Inserting memory module

仅供引用,我尝试了“/dev/memory”“memory”不同的名称和主要数字组合 - 但徒劳无功。

最佳答案

您正在将 FILE* 传递给 ioctl() 函数,而它需要一个文件描述符,即 int

它至少应该生成一个大警告,说明您正在将指针转换为整数而不进行强制转换,不是吗?

有两个明显的解决方案:

  1. 使用fileno() 函数从FILE* 中获取文件描述符。它应该类似于 ioctl(fileno(memfile), IOCTL_ALLOC_MSG)
  2. 使用open() 代替fopen()。如果您正在编写低级代码,这是首选解决方案,因为您避免了 FILE* 强加的额外抽象层(所有缓冲内容等)。

关于c - ioctl - 无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13851212/

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