gpt4 book ai didi

与 select() 混淆 - stdout 从未准备好写入

转载 作者:太空宇宙 更新时间:2023-11-04 02:40:39 24 4
gpt4 key购买 nike

这是一个简单的 select() 循环:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/select.h>

#define BUFSIZE 999

int main()
{
int select_result;
fd_set read_fds, write_fds;
struct timeval timeout = {0, 400000}, timeoutcopy;
const int max_fd = STDIN_FILENO > STDOUT_FILENO ? STDIN_FILENO :
STDOUT_FILENO;
char buffer[BUFSIZE];

fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK);
fcntl(STDOUT_FILENO, F_SETFL, fcntl(STDOUT_FILENO, F_GETFL) | O_NONBLOCK);
printf("Enter loop\n");
while(1) {
FD_ZERO(&read_fds);
FD_ZERO(&write_fds);
printf("Loop\n");
FD_SET(STDIN_FILENO, &read_fds);
FD_SET(STDOUT_FILENO, &write_fds);

timeoutcopy = timeout;
if ((select_result = select(max_fd, &read_fds, &write_fds, NULL,
&timeoutcopy)) < 0) {
return select_result;
}

if (FD_ISSET(STDIN_FILENO, &read_fds))
printf("Stdin ready for read\n");
fgets(buffer, BUFSIZE, stdin);
if (strlen(buffer))
printf("Stdin content: %s\n", buffer);
if (FD_ISSET(STDOUT_FILENO, &write_fds))
printf("Stdout ready for write\n");
}
}

它只是使用 select() 轮询 stdinstdout,超时为 400000 毫秒。当 stdin 准备就绪时,它会尝试读取它的内容并打印出来。当 stdout 准备就绪时,它会打印它准备就绪。

并且出于某种原因,在 select() 调用之后 stdin 从未就绪,为什么?

最佳答案

您的 max_fd 应该是“三个集合中任何一个中编号最大的文件描述符加 1”。根据选择手册页。我应该重命名它,这样你就会记得加 1。

关于与 select() 混淆 - stdout 从未准备好写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32266736/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com