C 无法将带有字符串的数组从内核空间返回到用户空间linux
我在内核空间中有这段代码,当程序从用户空间读取文件/dev/myprogram时调用:C 无法将带有字符串的数组从内核空间返回到用户空间linux,c,linux,linux-kernel,driver,C,Linux,Linux Kernel,Driver,我在内核空间中有这段代码,当程序从用户空间读取文件/dev/myprogram时调用: char **array = kmalloc(5, GFP_KERNEL); int i; for (i = 0; i < 5; ++i) { array[i] = kmalloc(100, GFP_KERNEL); } strcpy(array[0], "aaa"); strcpy(array[1], "fooyes"); strcpy(array[2], "
char **array = kmalloc(5, GFP_KERNEL);
int i;
for (i = 0; i < 5; ++i) {
array[i] = kmalloc(100, GFP_KERNEL);
}
strcpy(array[0], "aaa");
strcpy(array[1], "fooyes");
strcpy(array[2], "bbdfdfb");
strcpy(array[3], "ccc1234");
strcpy(array[4], "csddbbbbbcc");
copy_to_user(buffer, array, 500);
char**array=kmalloc(5,GFP_内核);
int i;
对于(i=0;i<5;++i){
数组[i]=kmalloc(100,GFP_内核);
}
strcpy(数组[0],“aaa”);
strcpy(数组[1],“fooyes”);
strcpy(数组[2],“bbdfb”);
strcpy(数组[3],“ccc1234”);
strcpy(数组[4],“csddbbcc”);
将_复制到_用户(缓冲区,数组,500);
用户空间中的代码,必须从内核空间获取列表:
#define BUFFER_LENGTH 500
char** receive;
int main(int argc, char* argv[])
{
int fd;
fd = open("/dev/myprogram", O_RDWR);
receive = malloc(5 * sizeof(char *));
int i;
for (i = 0; i < 5; ++i) {
receive[i] = (char *)malloc(100+1);
}
read(fd, receive, BUFFER_LENGTH);
for(i = 0; i < 5; i++)
{
printf("The received message is : [%s] \n", receive[i]);
}
#定义缓冲区长度500
字符**接收;
int main(int argc,char*argv[])
{
int-fd;
fd=打开(“/dev/myprogram”,O_RDWR);
接收=malloc(5*sizeof(char*);
int i;
对于(i=0;i<5;++i){
接收[i]=(字符*)malloc(100+1);
}
读取(fd、接收、缓冲区长度);
对于(i=0;i<5;i++)
{
printf(“收到的消息是:[%s]\n”,receive[i]);
}
当我试图获取这个字符串数组时,内核中出现了分段错误,没有显示任何内容。请帮助我找到传递整个列表的方法。有更好的方法吗?您只复制指针并尝试获取500字节,而只分配了5个字节。这对于64个数组中的一个指针都不够位系统和32位系统中的一位。这肯定会崩溃,因为你在多个地方越界。嘿,谢谢你的回答。你能帮我解决这个问题吗?如何复制所有数据?为整个数据分配足够的内存作为一个内存区域,将字符串连接到其中,复制出来,你的意思是,我必须使用char*Data而不是char**?并将所有数据推送到char*数据中,然后使用copy_to_user函数将其传递给用户?是的,没错。这还取决于您编写的实际其他代码。如果是char设备,则应该有一个读取方法,您可以在其中复制合适的部分等。因此,在看不到整个设备代码的情况下,无法准确地说出来。您只是一个copying指针并尝试获取500字节,而您只分配5字节。这对于64位系统中的一个指针和32位系统中的一个指针都是不够的。这肯定会崩溃,因为您在多个位置越界。嘿,谢谢您的回答。您能帮我解决这个问题吗?如何复制所有数据?分配足够的内存对于作为一个内存区域的整个数据,将字符串连接到其中,将其复制出来,kfree it你的意思是,我必须使用char*data而不是char**?并将所有数据推送到char*data,然后使用copy_to_user函数传递它?是的,没错。这还取决于你编写的其他实际代码。如果是char设备,应该e一种读取方法,在这种方法中,您可以复制出合适的部分等,因此在没有看到整个设备代码的情况下,无法准确地说出。