Advertisement
rnort

SPO-3-NIX RC2

Nov 8th, 2012
540
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 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. #include <iostream>
  11. #include <string>
  12.  
  13. #define SHMSZ 10
  14.  
  15. int main(int argc,char *argv[])
  16. {
  17.  
  18.     key_t key1 = 12345;
  19.     int semid;
  20.     unsigned short semval;
  21.     int cnt = 5;
  22.    
  23.     struct sembuf wait0, wait1, signal0, signal1;
  24.  
  25.     wait0.sem_num = 0;
  26.     wait0.sem_op = -1;
  27.     wait0.sem_flg = SEM_UNDO;
  28.  
  29.     wait1.sem_num = 1;
  30.     wait1.sem_op = -1;
  31.     wait1.sem_flg = SEM_UNDO;  
  32.  
  33.     signal0.sem_num = 0;
  34.     signal0.sem_op = 1;
  35.     signal0.sem_flg = SEM_UNDO;
  36.  
  37.     signal1.sem_num = 1;
  38.     signal1.sem_op = 1;
  39.     signal1.sem_flg = SEM_UNDO;
  40.  
  41.     semid = semget(key1, 2 ,IPC_CREAT);
  42.  
  43.     semval = 1;
  44.     semctl(semid,0, SETVAL, semval);
  45.     semctl(semid,1, SETVAL, semval);
  46.  
  47.     int shmid;  // shared memory segment ID
  48.     key_t key = 5678; // key for shared memory
  49.     char *shm, *s; // pointers to shared memory
  50.  
  51.     if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
  52.         perror("shmget");
  53.         exit(1);
  54.     }
  55.     if ((shm = (char*)shmat(shmid, NULL, 0)) == (char *) -1) {
  56.         perror("shmat");
  57.         exit(1);
  58.     }
  59.  
  60.     int childpid = fork();
  61.     int messageSentFully = 1;
  62.     int messageReceivedFully = 1;
  63.     if(childpid == 0)
  64.     {
  65.         std::string fullMessage;
  66.         while ( 1 )
  67.         {
  68.             semop(semid,&wait1,1);
  69.             messageReceivedFully = 0;
  70.             while( messageReceivedFully == 0)
  71.             {
  72.                 semop(semid,&wait0,1);
  73.                 // if ( messageReceivedFully == 1)
  74.                 // {
  75.                 //  puts("\nReceived message:");
  76.                 // }
  77.                 puts("1");
  78.                 char msg[SHMSZ] = {0};
  79.                 s = shm;
  80.                 for (int i = 0; i < SHMSZ; ++i)
  81.                 {
  82.                     msg[i] = s[i];
  83.                 }
  84.                 fullMessage += msg;
  85.                 if ( msg[SHMSZ-1] == 0 )
  86.                 {
  87.                     messageReceivedFully = 1;
  88.                 }
  89.                 else
  90.                 {
  91.                     messageReceivedFully = 0;
  92.                 }
  93.                 semop(semid,&signal0,1);
  94.             }
  95.             puts("\nReceived message:");
  96.             puts( fullMessage.c_str() );
  97.             if (fullMessage == "quit\n")
  98.             {
  99.                 break;
  100.             }
  101.             fullMessage = "";
  102.             semop(semid,&signal1,1);
  103.         }
  104.        
  105.         semctl(semid,0,IPC_RMID);
  106.         printf("Semaphore removed from the System = %s\n", strerror(errno));
  107.     }
  108.     else
  109.     {
  110.         while(1)
  111.         {
  112.             semop(semid,&wait1,1);
  113.             std::string message;
  114.             puts("\nEnter message:");
  115.             while( messageSentFully == 0)
  116.             {
  117.                 semop(semid, &wait0, 1);
  118.                 char msg[SHMSZ] = {0}; 
  119.                 int bytesRead = read( STDIN_FILENO, msg, SHMSZ );
  120.                 if (bytesRead < SHMSZ)
  121.                 {
  122.                     messageSentFully = 1;
  123.                 }
  124.                 else
  125.                 {
  126.                     messageSentFully = 0;
  127.                 }
  128.                 s = shm;
  129.                 for (int i = 0; i < SHMSZ; ++i)
  130.                 {
  131.                     s[i] = msg[i];
  132.                 }
  133.                 message += msg;
  134.                 semop(semid, &signal0, 1);
  135.             }
  136.             message = "";
  137.             if ( message == "quit\n")
  138.             {
  139.                 break;
  140.             }
  141.             semop(semid,&signal1,1);
  142.         }  
  143.     }
  144.     shmdt((void*)shm);
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement