Ramirez_RD

Lab6

Feb 13th, 2025
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.37 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <sys/wait.h>
  7. #include <semaphore.h>
  8. #include <fcntl.h>
  9.  
  10. #define BUFFER_SIZE 100
  11.  
  12. int main() {
  13.     int angel_to_ahrdie[2], ahrdie_to_angel[2];
  14.     pid_t pid;
  15.     char buffer[BUFFER_SIZE];
  16.  
  17.     if (pipe(angel_to_ahrdie) == -1 || pipe(ahrdie_to_angel) == -1) {
  18.         perror("🚨 Pipe creation failed");
  19.         exit(1);
  20.     }
  21.     sem_t *sem_angel_turn = sem_open("/sem_angel_turn", O_CREAT | O_EXCL, 0644, 1);
  22.     sem_t *sem_ahrdie_turn = sem_open("/sem_ahrdie_turn", O_CREAT | O_EXCL, 0644, 0);
  23.  
  24.     if (sem_angel_turn == SEM_FAILED || sem_ahrdie_turn == SEM_FAILED) {
  25.         perror("🚨 Semaphore creation failed");
  26.         exit(1);
  27.     }
  28.  
  29.     pid = fork();
  30.     if (pid < 0) {
  31.         perror("🚨 Fork failed");
  32.         exit(1);
  33.     }
  34.  
  35.     if (pid == 0) {
  36.         close(angel_to_ahrdie[1]);
  37.         close(ahrdie_to_angel[0]);
  38.         while (1) {
  39.             sem_wait(sem_ahrdie_turn);
  40.             read(angel_to_ahrdie[0], buffer, BUFFER_SIZE);
  41.             printf("😇 Angel: %s", buffer);
  42.             if (strncmp(buffer, "exit", 4) == 0) {
  43.                 break;
  44.             }
  45.             printf("😎 Ahrdie: ");
  46.             fgets(buffer, BUFFER_SIZE, stdin);
  47.             write(ahrdie_to_angel[1], buffer, strlen(buffer) + 1);
  48.             sem_post(sem_angel_turn);
  49.         }
  50.         close(angel_to_ahrdie[0]);
  51.         close(ahrdie_to_angel[1]);
  52.         sem_close(sem_angel_turn);
  53.         sem_close(sem_ahrdie_turn);
  54.         exit(0);
  55.     } else {
  56.         close(angel_to_ahrdie[0]);
  57.         close(ahrdie_to_angel[1]);
  58.         while (1) {
  59.             sem_wait(sem_angel_turn);
  60.             printf("😇 Angel: ");
  61.             fgets(buffer, BUFFER_SIZE, stdin);
  62.             write(angel_to_ahrdie[1], buffer, strlen(buffer) + 1);
  63.             if (strncmp(buffer, "exit", 4) == 0) {
  64.                 break;
  65.             }
  66.             sem_post(sem_ahrdie_turn);
  67.             read(ahrdie_to_angel[0], buffer, BUFFER_SIZE);
  68.             printf("😎 Ahrdie: %s", buffer);
  69.         }
  70.         close(angel_to_ahrdie[1]);
  71.         close(ahrdie_to_angel[0]);
  72.         sem_close(sem_angel_turn);
  73.         sem_close(sem_ahrdie_turn);
  74.         sem_unlink("/sem_angel_turn");
  75.         sem_unlink("/sem_ahrdie_turn");
  76.  
  77.         wait(NULL);
  78.     }
  79.     return 0;
  80. }
  81.  
Advertisement
Add Comment
Please, Sign In to add comment