Advertisement
agul

20131217 :: draft

Dec 17th, 2013
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.38 KB | None | 0 0
  1. #include <sys/ipc.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/sem.h>
  5. #include <sys/wait.h>
  6.  
  7. volatile int flag = 0;
  8.  
  9. void handler(int sig) {
  10.     flag = 1;
  11. }
  12.  
  13. void makeOp(struct sembuf * buf, short num, short op) {
  14.     buf->sem_num = num, buf->sem_op = op, buf->sem_flg = 0;
  15. }
  16.  
  17. int main(int argc, char ** argv) {
  18.     int fd[2];
  19.     pipe(fd);
  20.     int sem_key = ftok(argv[0], 1);
  21.     int semid = semget(sem_key, 2, IPC_CREAT | IPC_EXCL | 0666);
  22.     signal(SIGINT, handler);
  23.     int curValue = 0;
  24.     struct sembuf buf;
  25.     FILE * in = fdopen(fd[0], "r");
  26.     FILE * out = fdopen(fd[1], "w");
  27.     if (!fork()) {
  28.         while (1) {
  29.             if (flag) {
  30.                 printf("%d\n", curValue);
  31.                 fflush(stdout);
  32.                 break;
  33.             }
  34.             makeOp(&buf, 1, -1);
  35.             semop(semid, &buf, 1);
  36.             fscanf(in, "%d", &curValue);
  37.             ++curValue;
  38.             fprintf(out, "%d\n", curValue);
  39.             makeOp(&buf, 0, 1);
  40.             semop(semid, &buf, 1);
  41.         }
  42.         fclose(in), fclose(out);
  43.         return 0;
  44.     }
  45.     fprintf(out, "%d\n", 1); // начинаем с единички
  46.     makeOp(&buf, 1, 1);
  47.     semop(semid, &buf, 1);
  48.     while (1) {
  49.         if (flag) {
  50.             printf("%d\n", curValue);
  51.             fflush(stdout);
  52.             break;
  53.         }
  54.         makeOp(&buf, 0, -1);
  55.         semop(semid, &buf, 1);
  56.         fscanf(in, "%d", &curValue);
  57.         ++curValue;
  58.         fprintf(out, "%d\n", curValue);
  59.         makeOp(&buf, 1, 1);
  60.         semop(semid, &buf, 1);
  61.     }
  62.     fclose(in), fclose(out);
  63.     semctl(semid, 0, IPC_RMID);
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement