Hello,
When memory mapping a file with the MAP_PRIVATE flag, the modifications (writes)
only exist in memory and are not written back to the file.
According to the man pages, calling msync (3) on a such a mapping does NOT writes the changes back:
"When the msync() function is called on MAP_PRIVATE mappings, any modified data
shall not be written to the underlying object and shall not cause such data to be
made visible to other processes"
https://linux.die.net/man/3/msync
So: is there a way to write the changes back to the file?
An obvious application is:
- mapping the file with MAP_PRIVATE
- make some modifications in memory only (fast) while keeping the original version on disk (safe)
- at some point (when the user decides, and once the consistency of the changes
have been verified) writing the modifications to the disk
I'm pretty sure it exists some way or another, but I don't know how.
Hello,
When memory mapping a file with the MAP_PRIVATE flag, the modifications (writes) only exist in memory and are not written back to the file.[snip]
So: is there a way to write the changes back to the file?[snip]
Le 07/04/2024 … 15:34, pehache a ‚crit :
Hello,
When memory mapping a file with the MAP_PRIVATE flag, the modifications (writes)
only exist in memory and are not written back to the file.
According to the man pages, calling msync (3) on a such a mapping does NOT >> writes the changes back:
"When the msync() function is called on MAP_PRIVATE mappings, any modified data
shall not be written to the underlying object and shall not cause such data to be
made visible to other processes"
https://linux.die.net/man/3/msync
So: is there a way to write the changes back to the file?
An obvious application is:
- mapping the file with MAP_PRIVATE
- make some modifications in memory only (fast) while keeping the original >> version on disk (safe)
- at some point (when the user decides, and once the consistency of the changes
have been verified) writing the modifications to the disk
I'm pretty sure it exists some way or another, but I don't know how.
At the moment what I'm doing is something like:
========================================
fd = open("aaa",O_RDWR);
p = mmap ( NULL
, n
, PROT_READ | PROT_WRITE
, MAP_PRIVATE | MAP_NORESERVE
, fd
, 0 );
// writing to p; the changes exist only in memory
void* p2 = mmap( NULL
, n
, PROT_READ | PROT_WRITE
, MAP_SHARED | MAP_NORESERVE
, fd
, 0 );
memcpy(p2,p,n); // copying everything from p to p2
msync(p2,n);
// unmap/remap p so it's ready for new changes
munmap(p,n);
p = mmap ( NULL
, n
, PROT_READ | PROT_WRITE
, MAP_PRIVATE | MAP_NORESERVE
, fd
, 0 );
========================================
This works, but:
- the whole content is copied, not only the changed content
- is this code legal? Is there any potential conflict between the 2 mapping, with an undefined behavior?
On Sun, 07 Apr 2024 13:34:43 +0000, pehache wrote:
Hello,
Hi, pehache
When memory mapping a file with the MAP_PRIVATE flag, the modifications[snip]
(writes) only exist in memory and are not written back to the file.
So: is there a way to write the changes back to the file?[snip]
The comp.unix.programmer newsgroup will be of better help for this sort
of question (it's not really on-topic for comp.lang.c).
But, of the top of my head; with my limited understanding of the unix
mmap() kernel call, the only ways to "write the changes" are to either
1) mmap(MAP_SHARED) and modify the mapped area, or
2) write() the mapped area back to the file.
But, as I said, comp.unix.programmer will be of better help.
void* p2 = mmap( NULL
, n
, PROT_READ | PROT_WRITE
, MAP_SHARED | MAP_NORESERVE
, fd
, 0 );
On Sun, 07 Apr 24 15:18:47 +0000, pehache wrote:
void* p2 = mmap( NULL
, n
, PROT_READ | PROT_WRITE
, MAP_SHARED | MAP_NORESERVE
, fd
, 0 );
Not easy to remember what the arguments mean. Try this:
void * p2 = mmap^^^^ ^^^^ a null pointer is some kind of "addr"
(
/*addr =*/ NULL,
/*length =*/ n,^^^^ ^^^^
/*prot =*/ PROT_READ | PROT_WRITE,
/*flags =*/ MAP_SHARED | MAP_NORESERVE,^^^^
/*fd =*/ fd,^^ ^^
/*offset =*/ 0
);
On Sun, 07 Apr 24 15:18:47 +0000, pehache wrote:
void* p2 = mmap( NULL
, n
, PROT_READ | PROT_WRITE
, MAP_SHARED | MAP_NORESERVE
, fd
, 0 );
Not easy to remember what the arguments mean. Try this:
void * p2 = mmap
(
/*addr =*/ NULL,
/*length =*/ n,
/*prot =*/ PROT_READ | PROT_WRITE,
/*flags =*/ MAP_SHARED | MAP_NORESERVE,
/*fd =*/ fd,
/*offset =*/ 0
);
James Kuyper <jameskuyper@alumni.caltech.edu> writes:
On 4/7/24 15:09, pehache wrote:
Le 07/04/2024 … 15:49, Lew Pitcher a ‚crit :...
But, as I said, comp.unix.programmer will be of better help.
fu2
Why does that advice annoy you? Why wouldn't you want to take your
question to the forum where people are best qualified to answer it?
I believe "fu2" refers to this header line in the article you're
replying to :
Followup-To: comp.unix.programmer
pehache: Apparently James thought "fu2" meant ... something else.
... how did you manage to figure out the meanings and
order of the parameters in order to be able to write those comments?
If you have 1000s of calls to such functions, will you have those
comments plastered everwhere?
In a language with proper named/keyword arguments, you don't need to
remember the order.
Sysop: | Tetrazocine |
---|---|
Location: | Melbourne, VIC, Australia |
Users: | 7 |
Nodes: | 8 (0 / 8) |
Uptime: | 122:56:23 |
Calls: | 46 |
Files: | 21,492 |
Messages: | 64,818 |