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;
} 4 3454
On Tue, 2004-08-24 at 09:52 +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 highly implementation-defined. You would probably be much more
likely to get a sensible reply if you post to the newsgroup dealing with
your operating system and/or hardware platform.
Fredrik Tolf
Hao Xu <tr*******@vip.sina.com> wrote in message news:<cg***********@mail.cn99.com>... 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; }
on UNIX/LINUX machine your mmap system call will fail if you open the
file
in O_WRONLY mode and try to map that file with PROT_WRITE set for
MAP_SHARED
mapping. See the man page of mmap.
so you are trying to write at some invalid address, thats why SIGSEGV.
i would advise you that after every system call, you *must* always
check whether your system call was successful or not.
Hao Xu wrote: Hi everyone!
I found that if you want to write to the memory got by mmap(),
Mmap() is not part of ISO standard C, so this question is
off topic here.
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?
If you open the file write only and then read from it, I
would expect that it should not work. How it "doesn't
work" is probably unspecified and a segfault is not an
unreasonable version of "doesn't work".
Erik
--
+-----------------------------------------------------------+
Erik de Castro Lopo no****@mega-nerd.com (Yes it's valid)
+-----------------------------------------------------------+
`If you want a vision of the future, it is a wireless broadband
network feeding requests for foreign money-laundering assistance
into a human temporal lobe, forever. With banner ads.'
-- John M. Ford
junky_fellow wrote: Hao Xu <tr*******@vip.sina.com> wrote: 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?
.... snip ... on UNIX/LINUX machine your mmap system call will fail if you open the file in O_WRONLY mode and try to map that file with PROT_WRITE set for MAP_SHARED mapping. See the man page of mmap. so you are trying to write at some invalid address, thats why SIGSEGV.
i would advise you that after every system call, you *must* always check whether your system call was successful or not.
Please don't answer off-topic questions here other than to
redirect them to an appropriate newsgroup. Especially don't
answer them with more off-topic data, which won't be properly
evaluated because the knowledgeable people aren't here.
--
Chuck F (cb********@yahoo.com) (cb********@worldnet.att.net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home.att.net> USE worldnet address! This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Parzival |
last post by:
I have a program which works well on under Windows, which
I am trying to get to work under Linux (Mandrake 9.1)
It accesses a binary file with mmap. Under Windows,
the file maps and reads withut...
|
by: Claudio Grondi |
last post by:
Background information:
---------------------------------
in order to monitor mainboard sensory data
as fan speeds, temperatures, applications
like SpeedFan http://www.almico.com/speedfan.php
or...
|
by: Nick |
last post by:
excuse me!!
may i ask a simple problem here?
if i dynamically allocate a memory(ex. new in C++ or malloc in C)
in a sub-function and forget free the space end of the sub-function.
does it...
|
by: Hao Xu |
last post by:
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...
|
by: beejisbrigit |
last post by:
Hi there,
I was wondering if anyone had experience with File I/O in Java vs. C++
using mmap(),
and knew if the performance was better in one that the other, or more
or less negligible.
My...
|
by: koara |
last post by:
Hello all,
i am using the mmap module (python2.4) to access contents of a file.
My question regards the relative performance of mmap.seek() vs
mmap.tell(). I have a generator that returns...
|
by: Neal Becker |
last post by:
On linux, I don't understand why:
f = open ('/dev/eos', 'rw')
m = mmap.mmap(f.fileno(), 1000000, prot=mmap.PROT_READ|mmap.PROT_WRITE,
flags=mmap.MAP_SHARED)
gives 'permission denied', but...
|
by: Kris Kennaway |
last post by:
If I do the following:
def mmap_search(f, string):
fh = file(f)
mm = mmap.mmap(fh.fileno(), 0, mmap.MAP_SHARED, mmap.PROT_READ)
return mm.find(string)
def mmap_is_in(f, string):
fh =...
|
by: Gabriel Genellina |
last post by:
En Thu, 29 May 2008 19:17:05 -0300, Kris Kennaway <kris@FreeBSD.org>
escribió:
Looks like you should define the sq_contains member in mmap_as_sequence,
and the type should have the...
|
by: Aliciasmith |
last post by:
In an age dominated by smartphones, having a mobile app for your business is no longer an option; it's a necessity. Whether you're a startup or an established enterprise, finding the right mobile app...
|
by: tracyyun |
last post by:
Hello everyone,
I have a question and would like some advice on network connectivity. I have one computer connected to my router via WiFi, but I have two other computers that I want to be able to...
|
by: giovanniandrean |
last post by:
The energy model is structured as follows and uses excel sheets to give input data:
1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
|
by: NeoPa |
last post by:
Hello everyone.
I find myself stuck trying to find the VBA way to get Access to create a PDF of the currently-selected (and open) object (Form or Report).
I know it can be done by selecting :...
|
by: Teri B |
last post by:
Hi, I have created a sub-form Roles. In my course form the user selects the roles assigned to the course.
0ne-to-many. One course many roles.
Then I created a report based on the Course form and...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 1 Nov 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM)
Please note that the UK and Europe revert to winter time on...
|
by: nia12 |
last post by:
Hi there,
I am very new to Access so apologies if any of this is obvious/not clear.
I am creating a data collection tool for health care employees to complete. It consists of a number of...
|
by: NeoPa |
last post by:
Introduction
For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
|
by: GKJR |
last post by:
Does anyone have a recommendation to build a standalone application to replace an Access database? I have my bookkeeping software I developed in Access that I would like to make available to other...
| |