plz get me the code for shmget() in shared memory

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • jmbn2k
    New Member
    • Oct 2006
    • 14

    plz get me the code for shmget() in shared memory

    HI
    Can anyone please get me the code for shmget() function implementation in shared memory as soon as possible....... ..thank you
  • tyreld
    New Member
    • Sep 2006
    • 144

    #2
    Please be more specific. Are you wanting to see the actual library implementation of the "shmget" function, or are you wanting an example of how to write code that utilizes shared memory? Shared memory is not exactly a cake walk. In particular you usually need to utilze semaphores to synchronize access to the shared memory segment.

    Comment

    • jmbn2k
      New Member
      • Oct 2006
      • 14

      #3
      Originally posted by tyreld
      Please be more specific. Are you wanting to see the actual library implementation of the "shmget" function, or are you wanting an example of how to write code that utilizes shared memory? Shared memory is not exactly a cake walk. In particular you usually need to utilze semaphores to synchronize access to the shared memory segment.

      Can you please get me the library implementation and also an example of how to write code to utilize shared memory.......

      Comment

      • tyreld
        New Member
        • Sep 2006
        • 144

        #4
        If you want to see how shared memory is implemented then go look at the Linux kernel source code. That is an excercise I leave up to you. However, I will warn you that it is not pretty, and probably not going to make sense unless you have a high level understanding of C programming and the implementation of the Linux kernel.

        As far as using shared memory goes here is an incredibly simplistic client/server example using shared memory. Mind you in production code you want to use semaphores or a record locking mechanism for syncronization and concurrency which raise the code complexity by several magnitudes.

        Server.c
        Code:
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>
        #include <stdio.h>
        
        #define SHMSZ     27
        
        main()
        {
            char c;
            int shmid;
            key_t key;
            char *shm, *s;
        
            /*
             * We'll name our shared memory segment
             * "5678".
             */
            key = 5678;
        
            /*
             * Create the segment.
             */
            if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
                perror("shmget");
                exit(1);
            }
        
            /*
             * Now we attach the segment to our data space.
             */
            if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
                perror("shmat");
                exit(1);
            }
        
            /*
             * Now put some things into the memory for the
             * other process to read.
             */
            s = shm;
        
            for (c = 'a'; c <= 'z'; c++)
                *s++ = c;
            *s = NULL;
        
            /*
             * Finally, we wait until the other process 
             * changes the first character of our memory
             * to '*', indicating that it has read what 
             * we put there.
             */
            while (*shm != '*')
                sleep(1);
        
            exit(0);
        }
        Client.c
        Code:
        /*
         * shm-client - client program to demonstrate shared memory.
         */
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>
        #include <stdio.h>
        
        #define SHMSZ     27
        
        main()
        {
            int shmid;
            key_t key;
            char *shm, *s;
        
            /*
             * We need to get the segment named
             * "5678", created by the server.
             */
            key = 5678;
        
            /*
             * Locate the segment.
             */
            if ((shmid = shmget(key, SHMSZ, 0666)) < 0) {
                perror("shmget");
                exit(1);
            }
        
            /*
             * Now we attach the segment to our data space.
             */
            if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
                perror("shmat");
                exit(1);
            }
        
            /*
             * Now read what the server put in the memory.
             */
            for (s = shm; *s != NULL; s++)
                putchar(*s);
            putchar('\n');
        
            /*
             * Finally, change the first character of the 
             * segment to '*', indicating we have read 
             * the segment.
             */
            *shm = '*';
        
            exit(0);
        }

        Comment

        Working...