ivolff

Untitled

May 20th, 2021
625
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.07 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. #include <fcntl.h>
  6. #include <errno.h>
  7.  
  8.  
  9. volatile int current_fd_ind = -1;
  10. volatile int end = 0;
  11. volatile int files_count = 0;
  12.  
  13.  
  14. void handler1 (int signal) {
  15.     end = 1;
  16. }
  17.  
  18. void handler2 (int signal) {
  19.     current_fd_ind = signal - SIGRTMIN;
  20. }
  21.  
  22. int main(int argc, char *argv[]) {
  23.     files_count = argc - 1;
  24.     int pid  = getpid();
  25.     int fds[20];
  26.     long long sums[20];
  27.  
  28.     sigset_t sigset, empty;
  29.     sigemptyset(&sigset);
  30.     sigemptyset(&empty);
  31.     sigaddset(&sigset, SIGTERM);
  32.     for(int i = 0; i < argc - 1; i++) {
  33.         sigaddset(&sigset, SIGRTMIN + i);
  34.         sigaction(SIGRTMIN + i, &(struct sigaction) { .sa_handler = handler2, .sa_flags=0}, NULL);
  35.         fds[i] = open(argv[i + 1], O_RDONLY);
  36.         sums[i] = 0;
  37.     }
  38.     sigprocmask(SIG_BLOCK, &sigset, NULL);
  39.     sigaction(SIGTERM, &(struct sigaction) { .sa_handler = handler1, .sa_flags=0}, NULL);
  40.  
  41.     printf("%d\n", pid);
  42.     fflush(stdout);
  43.  
  44.     while(1) {
  45.         sigsuspend(&empty);
  46.         if (end) {
  47.             long long sum = 0;
  48.             for(int i = 0; i < argc - 1; i++) {
  49.                 sum += sums[i];
  50.                 if (fds[i] != -1) {
  51.                     close(fds[i]);
  52.                 }
  53.             }
  54.             printf("%lld\n", sum);
  55.             fflush(stdout);
  56.             exit(0);
  57.         }
  58.         while (current_fd_ind != -1 && fds[current_fd_ind] != -1) {
  59.             errno = 0;
  60.             char arg[17];
  61.             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
  62.             int flag = read(fds[current_fd_ind], &arg, 16);
  63.             sigprocmask(SIG_BLOCK, &sigset, NULL);
  64.             if (flag == -1 && errno == EINTR) {
  65.                 continue;
  66.             }
  67.             if (flag == 0) {
  68.                 close(fds[current_fd_ind]);
  69.                 fds[current_fd_ind] = -1;
  70.                 current_fd_ind = -1;
  71.             }
  72.             if (flag == 16) {
  73.                 sums[current_fd_ind] += strtoll(arg, NULL, 10);
  74.             }
  75.         }
  76.     }
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment