Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <errno.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <unistd.h>
- #ifdef __APPLE__
- #define SIGRTMIN SIGUSR1
- #endif
- typedef long long i64;
- typedef int i32;
- typedef char u8;
- typedef ssize_t isize;
- volatile static i32 weDone = 0;
- volatile static i32 mode = -1;
- static void handler(int signal) {
- if (signal == SIGTERM) {
- weDone = 1;
- } else {
- mode = signal - SIGRTMIN;
- }
- }
- isize myread(i32 fd, void *buf, isize size) {
- isize done = 0;
- while (done < size) {
- errno = 0;
- isize thisTime = read(fd, (u8*)buf + done, size - done);
- if (thisTime == -1) {
- if (errno == EINTR) {
- continue;
- }
- return -1;
- }
- if (thisTime == 0) {
- return 0;
- }
- done += thisTime;
- }
- }
- i32 main(i32 argc, u8 **argv) {
- i32 nfiles = argc - 1;
- i32 fds[nfiles];
- i64 sum[nfiles];
- struct sigaction act = {};
- act.sa_handler = handler;
- act.sa_flags = 0;
- sigset_t blockAll;
- sigset_t listeningSignals;
- sigfillset(&blockAll);
- sigfillset(&listeningSignals);
- for (i32 i = 0; i < nfiles; i++) {
- sigdelset(&listeningSignals, SIGRTMIN + i);
- }
- sigdelset(&listeningSignals, SIGTERM);
- sigemptyset(&act.sa_mask);
- for (i32 i = 0; i < nfiles; i++) {
- fds[i] = -1;
- sum[i] = 0;
- sigaction(SIGRTMIN + i, &act, NULL);
- }
- sigaction(SIGTERM, &act, NULL);
- sigprocmask(SIG_SETMASK, &blockAll, NULL);
- printf("%d\n", getpid());
- for (;;) {
- if (weDone) {
- for (i32 i = 0; i < nfiles; i++) {
- printf("%lld\n", sum[i]);
- }
- return 0;
- }
- if (mode == -1) {
- sigsuspend(&listeningSignals);
- continue;
- }
- if (fds[mode] == -1) {
- fds[mode] = open(argv[mode + 1], O_RDONLY);
- }
- if (fds[mode] == -2) {
- mode = -1;
- continue;
- }
- u8 buf[16];
- sigprocmask(SIG_SETMASK, &listeningSignals, NULL);
- isize rd = myread(fds[mode], &buf, 16);
- sigprocmask(SIG_SETMASK, &blockAll, NULL);
- if (rd == -1) {
- fds[mode] = -2;
- mode = -1;
- continue;
- }
- if (rd != 16) {
- continue;
- }
- i64 dat;
- sscanf(buf, "%lld", &dat);
- sum[mode] += dat;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement