我在内核模块中使用size_t
变量。当我想将其写入文件时,必须根据char*
签名将其转换为vfs_write
:
extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
我使用这个使用vfs_write
的函数(我在互联网上找到它):
int file_write(struct file *file, unsigned long long offset, unsigned
char *data, unsigned int size)
{
mm_segment_t oldfs;
int ret;
oldfs = get_fs();
set_fs(get_ds());
ret = vfs_write(file, data, size, &offset);
set_fs(oldfs);
return ret;
}
nbytes
变量为size_t
我尝试将(char *)
转换为nbytes
转换为char*
,但内核会立即崩溃。这是我的代码。
index_filename = "/home/rocket/Desktop/index_pool";
index_file = file_open(index_filename,O_WRONLY | O_CREAT, 0644);
if(index_file == NULL)
printk(KERN_ALERT "index_file open error !!.\n");
else{
// file_write(index_file, 0, nbytes, nbytes); => this crashs also
file_write(index_file, 0, (char*) nbytes, 100);
file_close(index_file);
}
有没有办法在内核中安全地将size_t
类型转换为char *
?
答案 0 :(得分:1)
当然它会崩溃 - 你试图写出100个字节的任何内存位置nbytes
指向的位置。因为它不是指针,所以极不可能是有效的内存区域。即使它是,它可能不是100字节大小。
您希望传递给vfs_write
的是指向nbytes
的指针。其大小为sizeof(nbytes)
。所以你要像这样调用你的包装函数
file_write(index_file, 0, (char*) &nbytes, sizeof(nbytes));
这将写出size_t
在nbytes
如果你想写出nbytes
的值,这与你在问题中看到的不同,你需要将它存储在一个字符串中并将其传递给你的函数,如下所示: / p>
char temp_string[20];
sprintf(temp_string,"%zu",nbytes);
file_write(index_file, 0, temp_string, strlen(temp_string));
答案 1 :(得分:1)
有没有办法在内核中安全地将size_t类型转换为char *?
是的。
您应该在sprintf
库中使用linux/kernel.h
函数
所以你应该做这样的事情:
sprintf(destination_char_star, "%zu", your_s_size_var);
小心你应该在需要时为char星分配内存。