Advertisement
Guest User

code

a guest
Mar 28th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.34 KB | None | 0 0
  1. #include <stdio.h> //стандартный ввод/вывод
  2. #include <sys/shm.h> //разделяемая память
  3. #include <sys/sem.h> //семафоры
  4. #include <sys/stat.h> //для флагов функции open (O_RDONLY)
  5. #include <fcntl.h> //для флагов функции open (O_RDONLY)
  6. #include <signal.h> //сигналы
  7.  
  8. int BLOCK_SIZE = 0;
  9.  
  10. /*
  11. * *
  12. * Число параметров командной строки - 2 *
  13. * 1 параметр - размер блока *
  14. * 2 параметр - имя файла *
  15. * * */ int main(int argc, char* argv[]) {
  16.  
  17. int shmid, semid; int pid;
  18. struct sembuf sbuf;
  19.  
  20. //проверка параметров командной строки if (argc < 3) {
  21. fprintf(stderr, "Недостаточно параметров!\n"); return 1;
  22. }
  23. if (strtol(argv[1], NULL, 10) < 1) {
  24. fprintf(stderr, "Неправильно введен первый параметр!\n"); return 1;
  25. }
  26.  
  27. BLOCK_SIZE = strtol(argv[1], NULL, 10);
  28.  
  29. //получаем id участка разделяемой памяти по ключу размером 8 байт с правами доступа
  30. 0600(для владельца)
  31. if ((shmid = shmget(IPC_PRIVATE, BLOCK_SIZE * sizeof(char), 0600 | IPC_CREAT)) == -1)
  32. {
  33. fprintf(stderr, "Ошибка в создании области разделяемой памяти\n"); return 1;
  34. }
  35.  
  36. //получаем id семафора
  37. if ((semid = semget(IPC_PRIVATE, 2, 0600 | IPC_CREAT)) == -1) { fprintf(stderr, "Ошибка в инициализации семафора\n"); return 1;
  38. }
  39.  
  40. //получаем виртуальный адрес разделяемой памяти, по которому будем читать/писать
  41. char* ptr = shmat(shmid, NULL, 0);
  42.  
  43. sbuf.sem_num = 0; sbuf.sem_op = 1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
  44.  
  45. if (pid = fork()) {
  46.  
  47. FILE *f;
  48.  
  49. //пытаемся открыть файл только для чтения с правами доступа 0600 (т.е. только для владельца)
  50. if ((f = open(argv[2], O_RDONLY, 0600)) == NULL) { kill(pid, SIGTERM); //посылаем сигнал завершения потомка fprintf(stderr, "Невозможно открыть файл %s!\n", argv[2]); return 1;
  51. } while(1) {
  52.  
  53. /*Ожидаем пока семафор 1 не будет равен 1 и вычитаем из него единицу */ sbuf.sem_num = 0; sbuf.sem_op = -1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
  54. //----------------------------------------------------------------------
  55. //fprintf(stdout, "Предок закрыл 1 семафор\n");
  56.  
  57. int bytes_read = read(f, ptr, BLOCK_SIZE); //читаем из файла 8 байт и записываем по адресу ptr
  58.  
  59.  
  60. /*Открываем семафор 2, прибавляя к нему единицу */ sbuf.sem_num = 1; sbuf.sem_op = 1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
  61. //----------------------------------------------------------------------
  62. //fprintf(stdout, "Предок открыл 2 семафор\n");
  63.  
  64. if (bytes_read < BLOCK_SIZE) break;
  65. }
  66.  
  67.  
  68. /*Ожидаем пока семафор 1 не будет равен 1 и вычитаем из него единицу */ sbuf.sem_num = 0; sbuf.sem_op = -1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
  69. //----------------------------------------------------------------------
  70. shmdt(shmid);
  71. semctl(semid, 0, IPC_RMID, NULL); close(f); kill(pid, SIGTERM);
  72. return 0;
  73. } else {
  74. while(1) {
  75.  
  76.  
  77. /*Ожидаем пока семафор 2 не будет равен 1 и вычитаем из него единицу */ sbuf.sem_num = 1; sbuf.sem_op = -1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
  78. //----------------------------------------------------------------------
  79. // fprintf(stdout, "Потомок закрыл 2 семафор\n");
  80.  
  81.  
  82. fprintf(stdout, "%s", ptr);
  83.  
  84. /*Открываем семафор 1, прибавляя к нему единицу */ sbuf.sem_num = 0; sbuf.sem_op = 1; sbuf.sem_flg = 0; semop(semid, &sbuf, 1);
  85. //----------------------------------------------------------------------
  86. // fprintf(stdout, "Потомок открыл 1 семафор\n");
  87.  
  88. }
  89. }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement