ivolff

Untitled

May 20th, 2021
982
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.17 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.         if (!end && !(current_fd_ind != -1 && fds[current_fd_ind] != -1)) {
  46.             sigsuspend(&empty);
  47.         }
  48.         if (end) {
  49.             long long sum = 0;
  50.             for(int i = 0; i < argc - 1; i++) {
  51.                 sum += sums[i];
  52.                 if (fds[i] != -1) {
  53.                     close(fds[i]);
  54.                 }
  55.             }
  56.             printf("%lld\n", sum);
  57.             fflush(stdout);
  58.             exit(0);
  59.         }
  60.         while (current_fd_ind != -1 && fds[current_fd_ind] != -1 && !end) {
  61.             errno = 0;
  62.             char arg[17];
  63.             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
  64.             int flag = read(fds[current_fd_ind], &arg, 16);
  65.             sigprocmask(SIG_BLOCK, &sigset, NULL);
  66.             if (flag == -1 && errno == EINTR) {
  67.                 continue;
  68.             }
  69.             if (flag == 0) {
  70.                 close(fds[current_fd_ind]);
  71.                 fds[current_fd_ind] = -1;
  72.                 current_fd_ind = -1;
  73.             }
  74.             if (flag == 16) {
  75.                 sums[current_fd_ind] += strtoll(arg, NULL, 10);
  76.             }
  77.         }
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment