471,079 Members | 1,064 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,079 software developers and data experts.

Problem about glibc2.3.3 mmap()!

Hi everyone!

I found that if you want to write to the memory got by mmap(), you have
to get the file descriptor for mmap() in O_RDWR mode. If you got the
file descriptor in O_WRONLY mode, then writing to the memory got by
mmap() will lead to segmentation fault. Anyone knows why? Is this a rule
or a bug?

What if I just want to write to the file and nothing else?

Please, look at my tiny program, I wrote this to test mmap(), it is cute.

#include <stdio.h>

typedef struct{
char name[4];
int age;
} people;

int main(int argc, char** argv) {
int fd, i;
people *p_map;
char temp;

fd = open(argv[1], O_RDWR|O_TRUNC); //this works fine

//fd = open(argv[1], O_WRONLY|O_TRUNC); this will cause segmentation fault

if (fd == -1) {
perror("open()");
}
lseek(fd, sizeof(people)*5-1, SEEK_SET);
write(fd, " " , 1);

p_map = (people *)mmap(NULL,sizeof(people)*5,PROT_WRITE,MAP_SHARED ,fd,0);
close(fd);

memset(p_map, '\0', sizeof(people)*5);

temp = 'b';
for(i=0; i<5; i++) {
temp++;
//(p_map+i)->name = "aaa";
//memcpy((p_map+i)->name, &temp, 2);
memset((p_map+i)->name, temp, 3);
(p_map+i)->age = 20+i;
}
printf("initialize over\n");
for(i=0; i<5; i++) {
printf("%s\t%d\n", (p_map+i)->name, (p_map+i)->age);
}
sleep(10);

munmap(p_map, sizeof(people)*5);
printf( "umap ok\n" );

return 0;
}
Nov 14 '05 #1
1 1261
On Tue, 2004-08-24 at 09:54 +0800, Hao Xu wrote:
Hi everyone!

I found that if you want to write to the memory got by mmap(), you have
to get the file descriptor for mmap() in O_RDWR mode. If you got the
file descriptor in O_WRONLY mode, then writing to the memory got by
mmap() will lead to segmentation fault. Anyone knows why? Is this a rule
or a bug?


That is not implemented in glibc. The mmap call is implemented in your
O/S kernel. You'll probably get a better reply if you post to the group
concerning that kernel, since this group deals with plain C (mmap is not
a part of C, it's a part of POSIX to begin with).

Fredrik Tolf
Nov 14 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Parzival | last post: by
6 posts views Thread by Nick | last post: by
4 posts views Thread by Hao Xu | last post: by
2 posts views Thread by beejisbrigit | last post: by
1 post views Thread by koara | last post: by
2 posts views Thread by Neal Becker | last post: by
reply views Thread by Kris Kennaway | last post: by
reply views Thread by Gabriel Genellina | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.