lil_kiddie

Untitled

Nov 27th, 2021
639
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. #include <signal.h>
  7. #include <fcntl.h>
  8. #include <sys/file.h>
  9.  
  10. volatile char flag = 0;
  11.  
  12. void child_handler(int signo) {
  13.     raise(SIGCHLD);
  14.     printf("Son terminates\n");
  15.     exit(0);
  16. }
  17.  
  18. void ctrlc_handler(int signo) {
  19.     printf("\nFather terminates\n");
  20.     exit(0);
  21. }
  22.  
  23. void usr_handler(int signo) {
  24.     return;
  25. }
  26.  
  27. void hand(int signo) {
  28.     flag = 1;
  29. }
  30.  
  31. void make_str(int fd) {
  32.     char c;
  33.     while (read(fd, &c, 1) && c != '\n' && c != ' ') {
  34.         putchar(c);
  35.     }
  36.     putchar('\n');
  37. }  
  38.  
  39. int main (int argc, char** argv) {
  40.     int fd = open(argv[argc - 1], O_RDONLY);
  41.     if (fd == -1)
  42.         return 0;
  43.     pid_t pid, parent = getpid();
  44.     signal(SIGUSR1, usr_handler);
  45.     if ((pid = fork()) == -1) {
  46.         perror("fork");
  47.         exit(1);
  48.     } else if (pid == 0) {
  49.         signal(SIGALRM, child_handler);
  50.         alarm(3);
  51.         while (1) {
  52.             pause();
  53.             printf("Son ");
  54.             make_str(fd);
  55.             kill(parent, SIGUSR1);
  56.         }
  57.     } else {
  58.         signal(SIGCHLD, hand);
  59.         signal(SIGINT, ctrlc_handler);
  60.         while (!flag) {
  61.             printf("Father ");
  62.             make_str(fd);
  63.             kill(pid, SIGUSR1);
  64.             pause();
  65.         }
  66.         while (1) {
  67.             printf("Father ");
  68.             make_str(fd);
  69.             sleep(1);
  70.         }
  71.         close(fd);
  72.         exit(0);
  73.     }
  74.     return 0;
  75. }
RAW Paste Data