--sas

sem+pipe

Oct 27th, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.09 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5.  
  6. #include <string.h>
  7. #include <sys/stat.h>
  8. #include <sys/ipc.h>
  9. #include <sys/sem.h>
  10.  
  11. #define N 5
  12. #define LMES 15
  13.  
  14. int main() {
  15.     char pathname[] = "c1.c";
  16.     char msg[15] = "Hello, friend!";
  17.     char resstring[15];
  18.  
  19.     int fd[2];
  20.     int semid;
  21.  
  22.     key_t key;
  23.     int resfork;
  24.     int i = 0;
  25.     ssize_t size;
  26.  
  27.     if ((key = ftok(pathname, 0)) < 0) { printf("e1\n"); exit(-1); }
  28.  
  29.     (void)umask(0000);
  30.     if ((semid = semget(key, 1, 0666|IPC_CREAT)) < 0) { printf("e2\n"); exit(-1); }
  31.     if (pipe(fd) < 0) { printf("e3\n"); exit(-1); }
  32.  
  33.     struct sembuf sembuf1;
  34.     sembuf1.sem_flg = 0;
  35.     sembuf1.sem_num = 0;
  36.  
  37.     resfork = fork();
  38.  
  39.     if (resfork < 0) {
  40.         printf("e4\n");
  41.         exit(-1);
  42.     }
  43.  
  44.     else if (resfork == 0) {
  45.         while (i < N) {
  46.             if (write(fd[1], msg, LMES) != LMES) { printf("e5\n"); exit(-1); }
  47.             sembuf1.sem_op = -1;
  48.             if (semop(semid, &sembuf1, 1) < 0) { printf("e6\n"); exit(-1); }
  49.             if ((read(fd[0], resstring, LMES) != LMES) || (strcmp(resstring, msg) != 0))
  50.             { printf("e7\n"); exit(-1); }
  51.             if (semop(semid, &sembuf1, 1) < 0) { printf("e8\n"); exit(-1); }
  52.             ++i;
  53.         }
  54.         if (close(fd[0]) < 0) { printf("c1\n"); exit(-1); }
  55.         if (close(fd[1]) < 0) { printf("c2\n"); exit(-1); }
  56.     }
  57.    
  58.     else if (resfork > 0) {
  59.         while (i < N) {
  60.             if ((read(fd[0], resstring, LMES) != LMES) || (strcmp(resstring, msg) != 0))
  61.             { printf("e9\n"); exit(-1); }
  62.             if (write(fd[1], msg, LMES) != LMES) { printf("e10\n"); exit(-1); }
  63.             sembuf1.sem_op = 2;
  64.             if (semop(semid, &sembuf1, 1) < 0) { printf("e11\n"); exit(-1); }
  65.             sembuf1.sem_op = 0;
  66.             if (semop(semid, &sembuf1, 1) < 0) { printf("e12\n"); exit(-1); }
  67.             ++i;
  68.         }
  69.         if (close(fd[0]) < 0) { printf("c3\n"); exit(-1); }
  70.         if (close(fd[1]) < 0) { printf("c4\n"); exit(-1); }
  71.     }
  72.  
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment