Advertisement
rnort

SPO-3-NIX RC1

Oct 28th, 2012
469
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/sem.h>
  5. #include <sys/ipc.h>
  6. #include <sys/types.h>
  7. #include <sys/shm.h>
  8. #include <string.h>
  9. #include <errno.h>
  10.  
  11. #define SHMSZ 10
  12.  
  13. int main(int argc,char *argv[])
  14. {
  15.  
  16.     key_t key1 = 12345;
  17.     int semid;
  18.     unsigned short semval;
  19.     int cnt = 5;
  20.    
  21.     struct sembuf wait, signal;
  22.  
  23.     wait.sem_num = 0;
  24.     wait.sem_op = -1;
  25.     wait.sem_flg = SEM_UNDO;
  26.  
  27.     signal.sem_num = 0;
  28.     signal.sem_op = 1;
  29.     signal.sem_flg = SEM_UNDO;
  30.  
  31.     semid = semget(key1,1,IPC_CREAT);
  32.  
  33.     semval = 1;
  34.     semctl(semid,0,SETVAL,semval);
  35.  
  36.     int shmid;  // shared memory segment ID
  37.     key_t key = 5678; // key for shared memory
  38.     char *shm, *s; // pointers to shared memory
  39.  
  40.     if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
  41.         perror("shmget");
  42.         exit(1);
  43.     }
  44.     if ((shm = (char*)shmat(shmid, NULL, 0)) == (char *) -1) {
  45.         perror("shmat");
  46.         exit(1);
  47.     }
  48.  
  49.     int childpid = fork();
  50.  
  51.     int messageSentFully = 1;
  52.     int messageReceivedFully = 1;
  53.     if(childpid == 0){
  54.  
  55.         //printf("Process2 \n");
  56.         while(1){
  57.             semop(semid,&wait,1);
  58.             if ( messageReceivedFully == 1)
  59.             {
  60.                 puts("\nReceived message:");
  61.             }
  62.             char msg[SHMSZ] = {0};
  63.             s = shm;
  64.             for (int i = 0; i < SHMSZ; ++i)
  65.             {
  66.                 msg[i] = s[i];
  67.             }
  68.             write(STDOUT_FILENO, msg, SHMSZ);
  69.             if ( strcmp( msg, "quit\n") == 0 )
  70.             {
  71.                 break;
  72.             }
  73.             if ( msg[SHMSZ-1] == 0 )
  74.             {
  75.                 messageReceivedFully = 1;
  76.             }
  77.             else
  78.             {
  79.                 messageReceivedFully = 0;
  80.             }
  81.             semop(semid,&signal,1);
  82.         }
  83.         semctl(semid,0,IPC_RMID);
  84.         printf("Semaphore removed from the System = %s\n", strerror(errno));
  85.     }
  86.     else
  87.     {
  88.         while(1)
  89.         {
  90.             semop(semid,&wait,1);
  91.             if (messageSentFully == 1)
  92.             {
  93.                 puts("\nEnter message:");
  94.             }
  95.             char msg[SHMSZ] = {0}; 
  96.             int bytesRead = read( STDIN_FILENO, msg, SHMSZ );
  97.             if (bytesRead < SHMSZ)
  98.             {
  99.                 messageSentFully = 1;
  100.             }
  101.             else
  102.             {
  103.                 messageSentFully = 0;
  104.             }
  105.             s = shm;
  106.             for (int i = 0; i < SHMSZ; ++i)
  107.             {
  108.                 s[i] = msg[i];
  109.             }
  110.             if ( strcmp(msg, "quit\n") == 0 )
  111.             {
  112.                 break;
  113.             }
  114.             semop(semid,&signal,1);
  115.         }  
  116.     }
  117.     shmdt((void*)shm);
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement