繁体   English   中英

如何在内核C中将size_t转换为char *?

[英]How to convert size_t to char* in kernel C?

我在内核模块中使用了size_t变量。 当我想将其写入文件时,必须根据vfs_write签名将其vfs_writechar*

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 * one?

当然,它会崩溃-您试图写入100个字节(无论nbytes指向nbytes位置)。 由于它不是指针,因此极不可能成为内存的有效区域。 即使是,也可能不是100个字节。

您想要传递给vfs_write是指向nbytes的指针。 那的大小将是sizeof(nbytes) 所以你可以这样调用包装器函数

file_write(index_file, 0, (char*) &nbytes, sizeof(nbytes));

这将写出size_tnbytes的存储位置中有多少个字节

如果您想写出nbytes的值,这与您在问题中询问的值不同,则需要将其存储在字符串中,并将其传递给函数,如下所示:

char temp_string[20];
sprintf(temp_string,"%zu",nbytes);
file_write(index_file, 0, temp_string, strlen(temp_string));

有没有一种方法可以在内核中安全地将size_t类型转换为char * one?

就在这里。 您应该在linux/kernel.h库中使用sprintf函数

因此,您应该执行以下操作:

sprintf(destination_char_star, "%zu", your_s_size_var);

注意,如果需要,您应该为char star分配内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM