将字符串存储在 mmap 共享数组中? (C)
storing strings in a mmap shared array? (C)
我正在尝试使用 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]);
}
当你这样做时:
filename = line;
shared_array[i] = filename;
您实际上并没有将 line
数组的内容复制到 shared_array
。您正在将 line
的地址分配给每个数组元素。结果,所有数组元素都指向同一个位置,即 line
,它将只包含最近存储的值。
您需要为每个要复制的字符串分配内存。你可以用 strdup
:
shared_array[i] = strdup(line);
但问题在于您的共享内存包含指向非共享内存的指针。
您需要在共享内存中为字符串数组分配 space:
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);
如果 MAXLINE 表示每个大小为 N 的字符串总数:-
你不能这样做。它将给出一个非常长的 MAXLINE X N 大小的字符串,并且必须使用偏移量来访问子字符串。
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] 来访问字符串。
即使每个字符串小于页面粒度,你也会浪费 space 但它会更容易访问。
或者直接使用
char shared_memory[100][MAXLINE];
我正在尝试使用 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]);
}
当你这样做时:
filename = line;
shared_array[i] = filename;
您实际上并没有将 line
数组的内容复制到 shared_array
。您正在将 line
的地址分配给每个数组元素。结果,所有数组元素都指向同一个位置,即 line
,它将只包含最近存储的值。
您需要为每个要复制的字符串分配内存。你可以用 strdup
:
shared_array[i] = strdup(line);
但问题在于您的共享内存包含指向非共享内存的指针。
您需要在共享内存中为字符串数组分配 space:
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);
如果 MAXLINE 表示每个大小为 N 的字符串总数:-
你不能这样做。它将给出一个非常长的 MAXLINE X N 大小的字符串,并且必须使用偏移量来访问子字符串。
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] 来访问字符串。 即使每个字符串小于页面粒度,你也会浪费 space 但它会更容易访问。
或者直接使用
char shared_memory[100][MAXLINE];