Deutsch English Français Italiano |
<zg5bFPBPOWrwfU5oe0Ftvee3OqQ@jntp> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.mixmin.net!proxad.net!feeder1-2.proxad.net!usenet-fr.net!pasdenom.info!from-devjntp Message-ID: <zg5bFPBPOWrwfU5oe0Ftvee3OqQ@jntp> JNTP-Route: news2.nemoweb.net JNTP-DataType: Article Subject: Re: Memory mapping: =?UTF-8?Q?MAP=5FPRIVATE=20and=20msync=28=29?= References: <osGzrqwQ8DBTJ8mCFoPEiv6Pn0M@jntp> <qmtiixDX3flrgimP-RUFSW_hf7o@jntp> Newsgroups: comp.lang.c,comp.unix.programmer Followup-To: comp.unix.programmer JNTP-HashClient: DhiH4rCtsa2DqAZvwt6pm0akAyw JNTP-ThreadID: Xt4PvXwVS7RUVBYIv4ru98146Os JNTP-ReferenceUserID: 44@news2.nemoweb.net JNTP-Uri: http://news2.nemoweb.net/?DataID=zg5bFPBPOWrwfU5oe0Ftvee3OqQ@jntp User-Agent: Nemo/0.999a JNTP-OriginServer: news2.nemoweb.net Date: Sun, 07 Apr 24 19:04:27 +0000 Organization: Nemoweb JNTP-Browser: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:109.0) Gecko/20100101 Firefox/115.0 Injection-Info: news2.nemoweb.net; posting-host="516ee13c1e79fa65aedf115a32aee346f9289ca9"; logging-data="2024-04-07T19:04:27Z/8809090"; posting-account="44@news2.nemoweb.net"; mail-complaints-to="julien.arlandis@gmail.com" JNTP-ProtocolVersion: 0.21.1 JNTP-Server: PhpNemoServer/0.94.5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-JNTP-JsonNewsGateway: 0.96 From: pehache <pehache.7@gmail.com> Bytes: 4001 Lines: 68 As advised, I'm copying this post here Le 07/04/2024 à 17:18, pehache a écrit : > 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?