Advertisement
rnort

SPO-3-NIX RC3

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