将字符串存储在mmap共享数组中? (C)

时间:2018-02-14 21:37:24

标签: c ipc mmap

我正在尝试使用mmap将当前目录中的所有文件名存储在共享数组中我可以将目录中的所有9个文件打印到屏幕但是当我尝试将它们存储在数组(shared_array)中并打印数组时,所有条目都包含相同的字符串(file.txt)。提前谢谢!

char **shared_array; 
shared_array= mmap(0,100*sizeof(char*),PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANON,-1,0);  
char * filename;

const MAXLINE = 80; 
char line [MAXLINE];

FILE *fp = popen("/bin/ls","r");

int i = 0; 
while(fgets(line, MAXLINE,fp) !=NULL){    
    filename = line;
    shared_array[i] = filename; 
    i++;        
}
pclose(fp);

int j;
for(j=0;j<i;j++){
    printf("\n%s",shared_array[j]);
}

2 个答案:

答案 0 :(得分:3)

执行此操作时:

filename = line;
shared_array[i] = filename; 

您实际上并未将line数组的内容复制到shared_array。您将line的地址分配给每个数组元素。因此,所有数组元素都指向同一个地方,即line,它只包含最近存储的值。

您需要为要复制的每个字符串分配内存。您可以使用strdup

执行此操作
shared_array[i] = strdup(line);

但问题是你有共享内存,包含指向非共享内存的指针。

您需要在共享内存中为字符串数组分配空间:

const MAXLINE = 80;
char (*shared_array)[MAXLINE]; 
shared_array= mmap(0,100*MAXLINE,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANON,-1,0);

然后您可以使用strcpy复制到每个数组元素中:

strcpy(shared_array[i], line); 

答案 1 :(得分:0)

如果MAXLINE表示大小为N的字符串总数:-

您不能这样做。这样会产生一个很长的字符串,大小为MAXLINE X N,并且必须使用offset来访问子字符串。

char (*shared_memory)[MAXLINE]  -> returns pointer to a string of size MAXLINE.
shared_array= mmap(0,100*MAXLINE,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANON,-1,0);

您需要这样做

char *shared_memory[MAXLINE] - This returns array of char pointers

for(int i=0; i<MAXLINE;i++){
shared_memory[i] = mmap(NULL,sizeof(char)*N,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS,-1,0);
}

现在,您可以通过执行shared_memory [i]来访问字符串。 即使每个字符串少于页面粒度,您也将浪费空间,但更易于访问。

或简单地使用

char shared_memory[100][MAXLINE];