Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> //стандартный ввод/вывод
- #include <sys/shm.h> //разделяемая память
- #include <sys/sem.h> //семафоры
- #include <sys/stat.h> //для флагов функции open (O_RDONLY)
- #include <fcntl.h> //для флагов функции open (O_RDONLY)
- #include <signal.h> //сигналы
- int BLOCK_SIZE = 0;
- /*
- * *
- * Число параметров командной строки - 2 *
- * 1 параметр - размер блока *
- * 2 параметр - имя файла *
- * * */ int main(int argc, char* argv[]) {
- int shmid, semid; int pid;
- struct sembuf sbuf;
- //проверка параметров командной строки if (argc < 3) {
- fprintf(stderr, "Недостаточно параметров!\n"); return 1;
- }
- if (strtol(argv[1], NULL, 10) < 1) {
- fprintf(stderr, "Неправильно введен первый параметр!\n"); return 1;
- }
- BLOCK_SIZE = strtol(argv[1], NULL, 10);
- //получаем id участка разделяемой памяти по ключу размером 8 байт с правами доступа
- 0600(для владельца)
- if ((shmid = shmget(IPC_PRIVATE, BLOCK_SIZE * sizeof(char), 0600 | IPC_CREAT)) == -1)
- {
- fprintf(stderr, "Ошибка в создании области разделяемой памяти\n"); return 1;
- }
- //получаем id семафора
- if ((semid = semget(IPC_PRIVATE, 2, 0600 | IPC_CREAT)) == -1) { fprintf(stderr, "Ошибка в инициализации семафора\n"); return 1;
- }
- //получаем виртуальный адрес разделяемой памяти, по которому будем читать/писать
- char* ptr = shmat(shmid, NULL, 0);
- sbuf.sem_num = 0; sbuf.sem_op = 1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
- if (pid = fork()) {
- FILE *f;
- //пытаемся открыть файл только для чтения с правами доступа 0600 (т.е. только для владельца)
- if ((f = open(argv[2], O_RDONLY, 0600)) == NULL) { kill(pid, SIGTERM); //посылаем сигнал завершения потомка fprintf(stderr, "Невозможно открыть файл %s!\n", argv[2]); return 1;
- } while(1) {
- /*Ожидаем пока семафор 1 не будет равен 1 и вычитаем из него единицу */ sbuf.sem_num = 0; sbuf.sem_op = -1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
- //----------------------------------------------------------------------
- //fprintf(stdout, "Предок закрыл 1 семафор\n");
- int bytes_read = read(f, ptr, BLOCK_SIZE); //читаем из файла 8 байт и записываем по адресу ptr
- /*Открываем семафор 2, прибавляя к нему единицу */ sbuf.sem_num = 1; sbuf.sem_op = 1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
- //----------------------------------------------------------------------
- //fprintf(stdout, "Предок открыл 2 семафор\n");
- if (bytes_read < BLOCK_SIZE) break;
- }
- /*Ожидаем пока семафор 1 не будет равен 1 и вычитаем из него единицу */ sbuf.sem_num = 0; sbuf.sem_op = -1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
- //----------------------------------------------------------------------
- shmdt(shmid);
- semctl(semid, 0, IPC_RMID, NULL); close(f); kill(pid, SIGTERM);
- return 0;
- } else {
- while(1) {
- /*Ожидаем пока семафор 2 не будет равен 1 и вычитаем из него единицу */ sbuf.sem_num = 1; sbuf.sem_op = -1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
- //----------------------------------------------------------------------
- // fprintf(stdout, "Потомок закрыл 2 семафор\n");
- fprintf(stdout, "%s", ptr);
- /*Открываем семафор 1, прибавляя к нему единицу */ sbuf.sem_num = 0; sbuf.sem_op = 1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
- //----------------------------------------------------------------------
- // fprintf(stdout, "Потомок открыл 1 семафор\n");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement