/**********************************************/
/* 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
Висновок: засвоїв використання у програмах загальних областей пам’яті та семафорів.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.