This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: second call to mmap() results in error


On Jan 29 09:00, Steven Bardwell wrote:
> My application needs several areas of shared memory, and I am getting an
> error ("No such device") on the second call to mmap(). The first call works
> fine.
> 
> Here a simple program that shows the error (compiled with
> gcc -o mmaptest mmaptest.c -lrt):
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <sys/types.h>
> #include <sys/errno.h>
> #include <fcntl.h>
> #include <sys/mman.h>
> 
> int main()
> {
>         int shm_fd1, shm_fd2;         
>         char *mmap1, *mmap2;
>  /*   get fd for each block of memory  */
>   shm_fd1 = shm_open("/block1", O_CREAT | O_RDWR, 0666);
>   if (shm_fd1 == -1) {
>                 fprintf(stderr, "Couldn't get fd for block1 (%s)\n",
> strerror(errno));
>                 exit(1);
>   }
>   shm_fd2 = shm_open("/block2", O_CREAT | O_RDWR, 0666);
>   if (shm_fd2 == -1) {
>                 fprintf(stderr, "Couldn't get fd for /UNI_queue (%s)\n",
> strerror(errno));
>                 exit(1);
>   }
>   /*  map each block  */
>   mmap1 = mmap(NULL, 524304, PROT_WRITE | PROT_READ, MAP_SHARED, shm_fd1,
> 0);
>         if (mmap1 == (char *)-1) {
>                 fprintf(stderr, "Couldn't map memory for /block1 (%s)\n",
> strerror(errno));
>                 exit(1);
>         }
>   mmap2 = mmap(NULL, 524304, PROT_WRITE | PROT_READ, MAP_SHARED, shm_fd2,
> 0);
>         if (mmap2 == (char *)-1) {
>                 fprintf(stderr, "Couldn't map memory for /block2 (%s)\n",
> strerror(errno));
>                 exit(1);
>         }
>         fprintf(stdout, "Shared memory initialized\n");
>         exit(0);
> }
> 
> The problem does not seem to depend on the size of the requested memory. The
> program
> always returns with "Couldn't map memory for /block2 (No such device)"

Try stracing it.  I tried it on the latest Cygwin from CVS as well
as on Cygwin 1.7.27 (32 bit versions) and it works fine for me.

Your testcase is missing an ftruncate or two., btw.  I guess you're
aware of that and just dropped them to get a the simple testcase.


Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Maintainer                 cygwin AT cygwin DOT com
Red Hat

Attachment: pgp2cE2uaJ5RQ.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]