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]

BUG: shmget() [was RE: shmget() not working(?)]


shmget() is not able to 'find' an existing shared memory segment
unless the 'flags' argument is set to '0'.  This is a bug.  If
flags = 0666 (or at least compatible with the permissions set
when the segment was created), it should still be able to find
and use the segment.

The test program:

#include <sys/shm.h>
#include <errno.h>

#define CHLD_MODE 0666

int
main(int argc, char **argv)
{
    int pid = fork();
    int id;

    if (pid == 0) {
        sleep(5);
        id = shmget(1, 100, CHLD_MODE);
        printf("child (%d): %d (%d)\n", getpid(), id, errno);
    } else {
        id = shmget(1, 100, IPC_CREAT | 0666);
        printf("parent (%d): %d (%d)\n", getpid(), id, errno);
        sleep(10);
        shmctl(id, IPC_RMID, 0);
    }

    return (0);
}

Produces the following output:

parent (35492): 196609 (0)
child (3876): 0 (0)

This shows that:
1.  The parent created the shared memory segment and got back its
ID (196609).
2.  The child process tried to attach to the parent's shared memory
segment (using the same key = 1), but shmget() returned 0 with no
error!

However, if CHLD_MODE is set to 0 in the code above, then:

parent (34084): 393216 (0)
child (11232): 393216 (0)

Which shows that the child did find the parent's shared memory
segment.
=====
Jerry D. Hedden
<< If you're not having fun, then you're not doing it right! >>


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


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