Загальні області пам’яті та семафори, страница 3

/**********************************************/

 /* READER                                     */

 /**********************************************/

  #include <unistd.h>

  #include <stdio.h>

  #include <stdlib.h>

  #include <string.h>

  #include <signal.h>

  #include <sys/sem.h>

  #include <sys/types.h>

  #include <sys/wait.h>

  #include <sys/shm.h>

  #include <sys/ipc.h>

  #include <sys/time.h>

  #include <time.h>

  #include "../srtRW.h"

  #include "../writers.h"

  #include "../curtime.c"

  static struct strRW this;  /* личные данные */

    union semun {

               int val;

               struct semid_ds *buf;

               unsigned short *array;

               } arg;

  #define shmSize ds.shm_segsz

  /**********************************************/

  main(int an, char *av[]) {

   int shmId;       /* идентификатор общей памяти */

   char *shm;       /*указатель на общую память */

   struct shmid_ds ds; /* управляющая структура памяти */

   int i;

   int sk;//ID semaforov

   struct sembuf sb[1];

   strcpy(this.name,av[0]);

   sscanf(av[1],"%d",shmId);//scan ID shared memory

   sscanf(av[2],"%d",sk);//scan ID semaforov

    /* инициализация генератора случайных чисел */ 

   srand(time(NULL));  

   shmctl(shmId,IPC_STAT,&ds);

   shm=(char *)shmat(shmId,(char *)0,0);

   while((semctl(sk,1,GETVAL,arg))!=1)

          usleep(100);         

   sb[0].sem_num=0;

   sb[0].sem_op=-1;

   sb[0].sem_flg=SEM_UNDO;

   semop(sk,sb,1);

   sb[0].sem_num=2;

   sb[0].sem_op=-1;

   sb[0].sem_flg=SEM_UNDO;

   semop(sk,sb,1);

   printf("%s - Reader %s : ",curtime(),this.name);

   for(i=0;i<8;i++)

          shm[i]=rand()%10;

   printf("\n");

   sb[0].sem_op=0;

   sb[0].sem_op=1;

   sb[0].sem_flg=SEM_UNDO;

   semop(sk,sb,1);

   sb[0].sem_num=2;

   sb[0].sem_op=1;

   sb[0].sem_flg=SEM_UNDO;

   semop(sk,sb,1);

    /* отсоединение общей памяти */

   shmdt(shm);

    /* нормальное завершение */

   printf("%s - Reader %s нормально завершился\n",curtime(),this.name);

   exit(0);

  }


Текст програми письменника:


/**********************************************/

 /* WRITER                                     */

 /**********************************************/

  #include <unistd.h>

  #include <stdio.h>

  #include <stdlib.h>

  #include <string.h>

  #include <signal.h>

  #include <sys/sem.h>

  #include <sys/types.h>

  #include <sys/wait.h>

  #include <sys/shm.h>

  #include <sys/ipc.h>

  #include <sys/time.h>

  #include <time.h>

  #include "../srtRW.h"

  #include "../writers.h"

  #include "../curtime.c"

  static struct strRW this;  /* личные данные */

    union semun {

               int val;

               struct semid_ds *buf;

               unsigned short *array;

               } arg;

  #define shmSize ds.shm_segsz

  /**********************************************/

  main(int an, char *av[]) {

   int shmId;       /* идентификатор общей памяти */

   char *shm;       /*указатель на общую память */

   struct shmid_ds ds; /* управляющая структура памяти */

   int i;

   int sk;//ID semaforov

   struct sembuf sb[1];

   strcpy(this.name,av[0]);

   sscanf(av[1],"%d",shmId);//scan ID shared memory

   sscanf(av[2],"%d",sk);//scan ID semaforov

    /* инициализация генератора случайных чисел */ 

   srand(time(NULL));  

   shmctl(shmId,IPC_STAT,&ds);

   shm=(char *)shmat(shmId,(char *)0,0);

   while((semctl(sk,0,GETVAL,arg))!=1)

          usleep(100);         

   sb[0].sem_num=0;

   sb[0].sem_op=-1;

   sb[0].sem_flg=SEM_UNDO;

   semop(sk,sb,1);

   sb[0].sem_num=1;

   sb[0].sem_op=-1;

   sb[0].sem_flg=SEM_UNDO;

   semop(sk,sb,1);

   printf("%s - Wrter %s : ",curtime(),this.name);

   for(i=0;i<8;i++)

          shm[i]=rand()%10;

   printf("\n");

   sb[0].sem_op=0;

   sb[0].sem_op=1;

   sb[0].sem_flg=SEM_UNDO;

   semop(sk,sb,1);

   sb[0].sem_num=1;

   sb[0].sem_op=1;

   sb[0].sem_flg=SEM_UNDO;

   semop(sk,sb,1);

    /* отсоединение общей памяти */

   shmdt(shm);

    /* нормальное завершение */

   printf("%s - Writer %s нормально завершился\n",curtime(),this.name);

   exit(0);

  }


Результат роботи:


02:40:07.204 Начало работы

02:40:08.217 - Writer Pyshkin запущен

02:40:08.218 - Reader Samitov запущен

02:40:08.218 - Writer Lermontov запущен

02:40:08.218 - Reader Gybin запущен

02:40:08.218 - Writer Chehov запущен

02:40:08.218 - Reader Polovinko запущен

02:40:08.219 - Writer Dostaevskii запущен

02:40:08.219 - Reader Chonka запущен

02:40:08.219 - Writer Griboedov запущен

02:40:08.219 - Reader Zakharenko запущен

02:40:08.219 - Writer Akynin запущен

02:40:08.219 - Reader Gaivoronskii запущен

02:40:08.219 - Writer Tolstoi запущен

02:40:08.219 - Reader Shkvaryk запущен

02:40:08.219 - Writer Haiam запущен

02:40:08.219 - Reader Povelica запущен

02:40:11.225 - Writer Pyshkin finish

02:40:11.225 - Reader Samitov finish

02:40:11.225 - Writer Lermontov finish

02:40:11.226 - Reader Gybin finish

02:40:11.226 - Writer Chehov finish

02:40:11.226 - Reader Polovinko finish

02:40:11.226 - Writer Dostaevskii finish

02:40:11.226 - Reader Chonka finish

02:40:11.226 - Writer Griboedov finish

02:40:11.226 - Reader Zakharenko finish

02:40:11.226 - Writer Akynin finish

02:40:11.226 - Reader Gaivoronskii finish

02:40:11.226 - Writer Tolstoi finish

02:40:11.226 - Reader Shkvaryk finish

02:40:11.226 - Writer Haiam finish

02:40:11.226 - Reader Povelica finish


Висновок: засвоїв використання у програмах загальних областей пам’яті та семафорів.