Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. #include <errno.h>
  2. #include <stdio.h>
  3. #include <fcntl.h>
  4. #include <signal.h>
  5. #include <unistd.h>
  6. #ifdef __APPLE__
  7. #define SIGRTMIN SIGUSR1
  8. #endif
  9.  
  10. typedef long long i64;
  11. typedef int i32;
  12. typedef char u8;
  13. typedef ssize_t isize;
  14.  
  15. volatile static i32 weDone = 0;
  16. volatile static i32 mode = -1;
  17.  
  18. static void handler(int signal) {
  19. if (signal == SIGTERM) {
  20. weDone = 1;
  21. } else {
  22. mode = signal - SIGRTMIN;
  23. }
  24. }
  25.  
  26. isize myread(i32 fd, void *buf, isize size) {
  27. isize done = 0;
  28. while (done < size) {
  29. errno = 0;
  30. isize thisTime = read(fd, (u8*)buf + done, size - done);
  31. if (thisTime == -1) {
  32. if (errno == EINTR) {
  33. continue;
  34. }
  35. return -1;
  36. }
  37. if (thisTime == 0) {
  38. return 0;
  39. }
  40. done += thisTime;
  41. }
  42. }
  43.  
  44. i32 main(i32 argc, u8 **argv) {
  45. i32 nfiles = argc - 1;
  46. i32 fds[nfiles];
  47. i64 sum[nfiles];
  48. struct sigaction act = {};
  49. act.sa_handler = handler;
  50. act.sa_flags = 0;
  51. sigset_t blockAll;
  52. sigset_t listeningSignals;
  53. sigfillset(&blockAll);
  54. sigfillset(&listeningSignals);
  55. for (i32 i = 0; i < nfiles; i++) {
  56. sigdelset(&listeningSignals, SIGRTMIN + i);
  57. }
  58. sigdelset(&listeningSignals, SIGTERM);
  59. sigemptyset(&act.sa_mask);
  60.  
  61. for (i32 i = 0; i < nfiles; i++) {
  62. fds[i] = -1;
  63. sum[i] = 0;
  64. sigaction(SIGRTMIN + i, &act, NULL);
  65. }
  66. sigaction(SIGTERM, &act, NULL);
  67. sigprocmask(SIG_SETMASK, &blockAll, NULL);
  68. printf("%d\n", getpid());
  69. for (;;) {
  70. if (weDone) {
  71. for (i32 i = 0; i < nfiles; i++) {
  72. printf("%lld\n", sum[i]);
  73. }
  74. return 0;
  75. }
  76. if (mode == -1) {
  77. sigsuspend(&listeningSignals);
  78. continue;
  79. }
  80. if (fds[mode] == -1) {
  81. fds[mode] = open(argv[mode + 1], O_RDONLY);
  82. }
  83. if (fds[mode] == -2) {
  84. mode = -1;
  85. continue;
  86. }
  87. u8 buf[16];
  88. sigprocmask(SIG_SETMASK, &listeningSignals, NULL);
  89. isize rd = myread(fds[mode], &buf, 16);
  90. sigprocmask(SIG_SETMASK, &blockAll, NULL);
  91. if (rd == -1) {
  92. fds[mode] = -2;
  93. mode = -1;
  94. continue;
  95. }
  96. if (rd != 16) {
  97. continue;
  98. }
  99. i64 dat;
  100. sscanf(buf, "%lld", &dat);
  101. sum[mode] += dat;
  102. }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement