首页 > 解决方案 > 似乎无法在 C 中将 select() 与标准输入一起使用

问题描述

我有一个客户端/服务器实现,我需要从终端读取输入以及使用套接字从服务器接收事件,但是 select() 似乎不适用于标准输入:

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);
  }

它不会进入“(FD_ISSET(0, &ctrl.read_fds)) { }” if 部分虽然我在终端上输入时看到了 select() 的返回并返回 1,但不要进入 FD_ISSET

标签: cselect

解决方案


推荐阅读