Кажется, не удается использовать select () с stdin в C - PullRequest
0 голосов
/ 29 мая 2020

У меня есть реализация клиент / сервер, в которой мне нужно читать входные данные с терминала, а также получать события с сервера с помощью сокета, однако select (), похоже, не работает со stdin:

static void get_active_inputs(cli_ctrl_t ctrl)
  {
      errno = 0;
      ctrl.max_fd = (0 > ctrl.control_socket) ? ctrl.control_socket:0;
      FD_ZERO(&ctrl.read_fds);
      FD_SET(ctrl.control_socket, &ctrl.read_fds);
      FD_SET(0, &ctrl.read_fds);
      if ((select(ctrl.max_fd + 1, &ctrl.read_fds, NULL, NULL, NULL)) < 0 && \
              (errno != EINTR)) {
          perror("select()");
          exit(84);
      }
  }

static int shell(cli_ctrl_t ctrl)
  {
      char **toks = NULL;
      char *line = NULL;
      size_t len = 0;
      size_t i = 0;

      while (1) {
          get_active_inputs(ctrl);
          if (FD_ISSET(ctrl.control_socket, &ctrl.read_fds)) {
              printf("Got message from server\n");
          }
          if (FD_ISSET(0, &ctrl.read_fds)) {
            printf("Got inputs from client\n");
            getline(&line, &len, stdin);
            toks = sep_tok(line, "  \n\r\t");
            for (; commands[i].str != NULL; i++) {
                if (strcmp(commands[i].str, toks[0]) == 0) {
                    commands[i].ptr(&ctrl, toks);
                  }
              }
          }
      }
      return (0);
  }

It не будет входить в раздел «(FD_ISSET (0, & ctrl.read_fds)) {}», хотя я наблюдал за возвратом select (), когда я набирал на терминале, и он возвращает 1, но не входите в FD_ISSET

...