Advertisement
utroz

Shared Memory with Fork

Dec 28th, 2011
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.59 KB | None | 0 0
  1. /* Shared Memory with Fork
  2.  * by Utroz */
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8.  
  9. #include <sys/shm.h>
  10. #include <sys/ipc.h>
  11.  
  12. #define BUFFER_SIZE 256
  13.  
  14. struct shared_use_st {
  15.         pid_t pid;
  16.         char buffer[BUFFER_SIZE];
  17.         struct shared_use_st *next;
  18. };
  19. typedef struct shared_use_st __shared_struct;
  20.  
  21. void error(const char *);
  22. __shared_struct *insert_on_list(char *, __shared_struct *);
  23. void print_the_data_list(__shared_struct *);
  24.  
  25. int main(void)
  26. {
  27.         void *shared_memory = (void *)0;
  28.         __shared_struct *shared_stuff, *begin_list;
  29.         pid_t pid;
  30.        
  31.         /* Shared Memory */
  32.         key_t key; /* key to be passed to shmget() */
  33.         int shmflg; /* shmflg to be passed to shmget() */
  34.         int shmid; /* return value from shmget() */
  35.         size_t size; /* size to be passed to shmget() */      
  36.        
  37.         /*
  38.          * We'll name our shared memory segment
  39.          * and fill data's.
  40.          */
  41.         key = (key_t) getuid();
  42.         size = sizeof(__shared_struct);
  43.         shmflg = IPC_CREAT | 0666;      
  44.        
  45.         /* Creating a shared memory segment */
  46.         shmid = shmget (key, size, shmflg);
  47.         if (shmid == -1)
  48.         error("shmget failed");
  49.        
  50.         /*
  51.          * Now we attach the segment to our data space.
  52.          */
  53.         shared_memory = shmat(shmid, (void *)0, 0);
  54.         if (shared_memory == (void *) -1)
  55.         error("shmat failed");        
  56.  
  57.         printf("Memory attached at %X PID: %d\n", (int)shared_memory, getpid());        
  58.         shared_stuff = (__shared_struct *)shared_memory;
  59.         shared_stuff = NULL;
  60.  
  61.         shared_stuff = insert_on_list("Message (1) from ", shared_stuff);
  62.        
  63.         /* Create First fork() */      
  64.         pid = fork();  
  65.         if (pid < 0)
  66.         error("Error on fork!");
  67.         else if (pid == 0)
  68.             print_the_data_list(shared_stuff);
  69.  
  70.         shared_stuff = insert_on_list("Message (2) from ", shared_stuff);
  71.        
  72.         print_the_data_list(shared_stuff);
  73.        
  74.         while (1)
  75.         sleep(1);        
  76.        
  77.         /* Lastly, the shared memory is detached and then deleted. */
  78.         if (shmdt(shared_memory) == -1)
  79.         error("shmdt failed");      
  80.  
  81.         if (shmctl(shmid, IPC_RMID, 0) == -1)
  82.         error("shmctl(IPC_RMID) failed");        
  83.  
  84.         return (EXIT_SUCCESS);
  85. }
  86.  
  87. void error(const char *msg)
  88. {
  89.         perror(msg);
  90.         exit(EXIT_FAILURE);
  91. }
  92.  
  93. __shared_struct *insert_on_list(char *args, __shared_struct *list)
  94. {
  95.         int new_shmid;
  96.         void *shared_memory = (void *)0;
  97.         __shared_struct *new_list;
  98.        
  99.         new_shmid = shmget ((key_t) getuid(), sizeof(__shared_struct), IPC_CREAT | 0666);
  100.         if (new_shmid == -1)   
  101.         error("shmget failed");
  102.        
  103.         shared_memory = shmat(new_shmid, (void *)0, 0);        
  104.         new_list = (__shared_struct *)shared_memory;
  105.        
  106.         /* Fills data's on the struct memory block */
  107.         memset(new_list->buffer, 0, BUFFER_SIZE);
  108.        
  109.         new_list->pid = getpid();
  110.         strcpy(new_list->buffer, args);
  111.         new_list->next = list;
  112.        
  113.         return new_list;
  114. }
  115.  
  116. void print_the_data_list(__shared_struct *data)
  117. {
  118.         __shared_struct *aux_list;
  119.         aux_list = data;    
  120.  
  121.         while(aux_list != NULL && aux_list->pid != 0) {
  122.         fprintf(stdout, "PID: %d | %s PID %d. | Buf: %s\n", getpid(), aux_list->buffer, aux_list->pid);
  123.         aux_list = aux_list->next;
  124.         sleep(2);
  125.         }
  126.        
  127.         return print_the_data_list(data);
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement