Date: Thu, 23 Aug 2001 20:07:31 +0200 From: Bernd Walter <ticso@mail.cicely.de> To: Julian Elischer <julian@elischer.org> Cc: Alfred Perlstein <bright@mu.org>, Bernd Walter <ticso@mail.cicely.de>, freebsd-hackers@freebsd.org Subject: Re: mmap MAP_INHERIT question. Message-ID: <20010823200731.A27427@cicely20.cicely.de> In-Reply-To: <Pine.BSF.4.21.0108231012330.48732-100000@InterJet.elischer.org>; from julian@elischer.org on Thu, Aug 23, 2001 at 10:13:01AM -0700 References: <20010823083711.Z81307@elvis.mu.org> <Pine.BSF.4.21.0108231012330.48732-100000@InterJet.elischer.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Thu, Aug 23, 2001 at 10:13:01AM -0700, Julian Elischer wrote:
> exec gives you an new vm space..
> inherrit only applies to forks
Then the manpage is absolutely wrong:
MAP_INHERIT Permit regions to be inherited across execve(2) system
calls.
I asumed MAP_SHARED alone is suffient for fork!?
> On Thu, 23 Aug 2001, Alfred Perlstein wrote:
>
> > * Bernd Walter <ticso@mail.cicely.de> [010823 06:16] wrote:
> > > I do the following:
> > > buf = (char*)mmap(NULL, BUFSIZE, PROT_READ | PROT_WRITE,
> > > MAP_ANON | MAP_INHERIT | MAP_SHARED, -1, 0);
> > >
> > > Now I vfork/execve a child.
> > > But the child can't access the mmaped memory.
> > > It was my understanding that MAP_INHERIT | MAP_SHARED keep the memory
> > > over the execve.
> >
> > Without sample code this is impossible to explain.
It's attached.
Start prog1 and prog2 should see the mmaped memory.
In the complex case I found it the second program wasn't able to read.
In this simple case it is able to read some different value and crashed
my i386-current (4.7.2001) when prog1 finishes.
I can't say if it's also a problem on recent current and the system did
not wrote a crashdump...
--
B.Walter COSMO-Project http://www.cosmo-project.de
ticso@cicely.de Usergroup info@cosmo-project.de
[-- Attachment #2 --]
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
void ncox(int fd) {
int val;
int res;
val = fcntl(fd, F_GETFD, 0);
res = fcntl(fd, F_SETFD, val & ~FD_CLOEXEC);
}
void cox(int fd) {
int val;
int res;
val = fcntl(fd, F_GETFD, 0);
res = fcntl(fd, F_SETFD, val | FD_CLOEXEC);
}
int
main(int argc, char *argv[]) {
char *buf;
pid_t pid;
int sv[2];
int val;
char arg0[] = "prog2";
char* arg[] = {arg0, 0};
buf = (char*)mmap(NULL, 8192, PROT_READ | PROT_WRITE,
MAP_ANON | MAP_INHERIT | MAP_SHARED, -1, 0);
buf[0] = 'a';
buf[1] = '\0';
printf("Buffer Prog1 = %p(%s)\n", buf, buf);
socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
printf("socketpair returned %i,%i\n", sv[0], sv[1]);
sv[0];
cox(sv[0]);
cox(sv[1]);
val = fcntl(sv[0], F_GETFL, 0);
fcntl(sv[0], F_SETFL, val | O_NONBLOCK);
pid = vfork();
if (pid == 0) {
dup2(sv[1], 3);
ncox(3);
execve("./prog2", arg, 0);
}
close(sv[1]);
write(sv[0], &buf, sizeof(buf));
sleep(100);
return 0;
}
[-- Attachment #3 --]
#include <sys/types.h>
#include <stdio.h>
int
main(int argc, char *argv[]) {
char *buf;
read(3, &buf, sizeof(buf));
printf("Buffer Prog2 = %p", buf);
printf("(%s)\n", buf);
sleep(100);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010823200731.A27427>
