我在内核模块中使用了一个size_t
变量。当我要将其写入文件时,必须根据char*
签名将其转换为vfs_write
:
extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
我使用这个函数,它使用
vfs_write
(我在internet上找到它):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
但内核立即崩溃。这是我的密码。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);
}
有没有办法在内核中将
char*
类型安全地转换为size_t
类型? 最佳答案
当然,它会崩溃-您正在尝试写入nbytes
指向的任何内存位置的100字节。因为它不是指针,所以它不太可能是内存的有效区域。即使是,它的大小也可能不是100字节。
您想要传递给vfs_write
的是指向nbytes
的指针。它的大小是sizeof(nbytes)
。所以你可以这样调用包装函数
file_write(index_file, 0, (char*) &nbytes, sizeof(nbytes));
它将写出a
size_t
在nbytes
的内存位置有多少字节如果要写出
nbytes
的值,这与您在问题中提出的问题不同,则需要将其存储在字符串中,并将其传递给函数,如下所示:char temp_string[20];
sprintf(temp_string,"%zu",nbytes);
file_write(index_file, 0, temp_string, strlen(temp_string));