share memory

header for public argument:shmdata.h

#define TEXT_SZ 2048

struct shared_use_st

{

        int written;

        char text[TEXT_SZ];

};

#endif

 

 

shmread.c

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/shm.h>

#include "shmdata.h"

int main()

{

        int running = 1;

        void *shm = NULL;

        struct shared_use_st *shared;

        int shmid;  

       shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);

        if(shmid == -1)

        {

                fprintf(stderr, "shmget failed\n");

                exit(EXIT_FAILURE);

        }

        shm = shmat(shmid, 0, 0);

        if(shm == (void*)-1)

        {  

               fprintf(stderr, "shmat failed\n");

                exit(EXIT_FAILURE);

        }  

       shared = (struct shared_use_st*)shm;

        shared->written = 0;  

       while(running)

        {     

            if(shared->written != 0)

           {  

                       printf("You wrote: %s", shared->text);

                        sleep(rand() % 3);

                        shared->written = 0;  

                       if(strncmp(shared->text, "end", 3) == 0)

                                running = 0;

            }    

             else

                        sleep(1);

        }

        if(shmdt(shm) == -1)

        {

                fprintf(stderr, "shmdt failed\n");

                exit(EXIT_FAILURE);

        }

        if(shmctl(shmid, IPC_RMID, 0) == -1)

        {
                fprintf(stderr, "shmctl(IPC_RMID) failed\n");
                exit(EXIT_FAILURE);
        }
        exit(EXIT_SUCCESS);
}

 

 

shmwrite.c

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/shm.h>

#include "shmdata.h"

int main()

{

        int running = 1;

        void *shm = NULL;

        struct shared_use_st *shared = NULL;   

      char buffer[BUFSIZ + 1];  

       int shmid;  

       shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);

        if(shmid == -1)

        {

                fprintf(stderr, "shmget failed\n");

                exit(EXIT_FAILURE);

        }  

       shm = shmat(shmid, (void*)0, 0);

        if(shm == (void*)-1)

        {

                fprintf(stderr, "shmat failed\n");

                exit(EXIT_FAILURE);

        }

        shared = (struct shared_use_st*)shm;

        while(running)

  {

                while(shared->written == 1)

                {

                        sleep(1);

                        printf("Waiting...\n");

                }

                printf("Enter some text: ");

                fgets(buffer, BUFSIZ, stdin);

                strncpy(shared->text, buffer, TEXT_SZ);

                shared->written = 1;

                if(strncmp(buffer, "end", 3) == 0)

                        running = 0;

        }   

      if(shmdt(shm) == -1)

        {  

               fprintf(stderr, "shmdt failed\n");

                exit(EXIT_FAILURE);

        }

        sleep(2);
        exit(EXIT_SUCCESS);
}

 

posted @ 2017-07-12 11:37  Edver  阅读(246)  评论(0编辑  收藏  举报