c - 似乎无法在 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
解决方案
推荐阅读
- ms-access - 在右键单击命令栏菜单上获取当前记录
- c# - 从 Access DB 读取附件:在此集合中找不到项目
- reactjs - 授权问题:Axios POST 中的 Bearer access_token(标头)反应
- c# - ASP.Net MVC 插入时出现重复键异常
- javascript - 动态下拉列表给出 PHP 错误未定义变量
- r - 清理数据时将列中的多个变量类型分离到自己的列中
- javascript - 使用页面中的内容插入表格等
- python - 您如何模拟假期前后具有可变季节性的零售销售?
- python - 如何通过在现有列上应用函数来将列添加到 pyspark DataFrame?
- pandas - 如何使用 scipy.integrate.trapz() 集成系列