Guest User

select.c

a guest
Mar 11th, 2022
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.86 KB | None | 0 0
  1. #include <sys/select.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <signal.h>
  6. #include <errno.h>
  7.  
  8.  
  9. void child(int* pipe) {
  10.     int counter = 0;
  11.     close(pipe[0]);
  12.     while (1) {
  13.         sleep(1);
  14.         dprintf(pipe[1], "%d %d\n", getpid(), counter++);
  15.     }
  16. }
  17.  
  18.  
  19. void fork_child(int* pipes, size_t i) {
  20.     pipe(pipes + i*2);
  21.     if (!fork()) {
  22.         child(pipes + i*2);
  23.         _exit(0);
  24.     }
  25. }
  26.  
  27.  
  28. sig_atomic_t need_fork;
  29.  
  30.  
  31. void handler(int sig) {
  32.     need_fork = 1;
  33. }
  34.  
  35.  
  36. int main(int argc, char* argv[]) {
  37.     if (argc < 2) {
  38.         exit(1);
  39.     }
  40.     size_t N = atoi(argv[1]);
  41.     int pipes[N*2];
  42.     int existing_children = 0;
  43.  
  44.     signal(SIGUSR1, handler);
  45.  
  46.     sigset_t sigset, oldmask;
  47.     sigemptyset(&sigset);
  48.     sigaddset(&sigset, SIGUSR1);
  49.     sigprocmask(SIG_BLOCK, &sigset, &oldmask);
  50.  
  51.     fd_set readfds;
  52.     while(1) {
  53.         if (need_fork) {
  54.             fork_child(pipes, existing_children++);
  55.             need_fork = 0;
  56.         }
  57.         FD_ZERO(&readfds);
  58.         int max = 0;
  59.         for (size_t i = 0; i < existing_children; i++) {
  60.             int fd = pipes[i*2];
  61.             FD_SET(fd, &readfds);
  62.             max = max < fd ? fd : max;
  63.         }
  64.         struct timespec tv;
  65.         tv.tv_sec = 10;
  66.         tv.tv_nsec = 0;
  67.  
  68.         if (pselect(max + 1, &readfds, NULL, NULL, &tv, &oldmask) < 0) {
  69.             if (errno == EINTR) {
  70.                 continue;
  71.             }
  72.             perror("select");
  73.             return 1;
  74.         }
  75.         for (size_t i = 0; i < existing_children; i++) {
  76.             int fd = pipes[i*2];
  77.             if (FD_ISSET(fd, &readfds)) {
  78.                 char buf[1024] = {0};
  79.                 read(fd, buf, sizeof(buf) - 1);
  80.                 printf("%s (%ld sec %ld nsec left)\n", buf, tv.tv_sec, tv.tv_nsec);
  81.             }
  82.         }
  83.     }
  84. }
  85.  
Advertisement
Add Comment
Please, Sign In to add comment