У меня есть реализация клиент / сервер, в которой мне нужно читать входные данные с терминала, а также получать события с сервера с помощью сокета, однако 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