Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <fcntl.h>
- #include <errno.h>
- volatile int current_fd_ind = -1;
- volatile int end = 0;
- volatile int files_count = 0;
- void handler1 (int signal) {
- end = 1;
- }
- void handler2 (int signal) {
- current_fd_ind = signal - SIGRTMIN;
- }
- int main(int argc, char *argv[]) {
- files_count = argc - 1;
- int pid = getpid();
- int fds[20];
- long long sums[20];
- sigset_t sigset, empty;
- sigemptyset(&sigset);
- sigemptyset(&empty);
- sigaddset(&sigset, SIGTERM);
- for(int i = 0; i < argc - 1; i++) {
- sigaddset(&sigset, SIGRTMIN + i);
- sigaction(SIGRTMIN + i, &(struct sigaction) { .sa_handler = handler2, .sa_flags=0}, NULL);
- fds[i] = open(argv[i + 1], O_RDONLY);
- sums[i] = 0;
- }
- sigprocmask(SIG_BLOCK, &sigset, NULL);
- sigaction(SIGTERM, &(struct sigaction) { .sa_handler = handler1, .sa_flags=0}, NULL);
- printf("%d\n", pid);
- fflush(stdout);
- while(1) {
- sigsuspend(&empty);
- if (end) {
- long long sum = 0;
- for(int i = 0; i < argc - 1; i++) {
- sum += sums[i];
- if (fds[i] != -1) {
- close(fds[i]);
- }
- }
- printf("%lld\n", sum);
- fflush(stdout);
- exit(0);
- }
- while (current_fd_ind != -1 && fds[current_fd_ind] != -1) {
- errno = 0;
- char arg[17];
- sigprocmask(SIG_UNBLOCK, &sigset, NULL);
- int flag = read(fds[current_fd_ind], &arg, 16);
- sigprocmask(SIG_BLOCK, &sigset, NULL);
- if (flag == -1 && errno == EINTR) {
- continue;
- }
- if (flag == 0) {
- close(fds[current_fd_ind]);
- fds[current_fd_ind] = -1;
- current_fd_ind = -1;
- }
- if (flag == 16) {
- sums[current_fd_ind] += strtoll(arg, NULL, 10);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment