gpt4 book ai didi

c - fgets 会更改文件描述符集吗?

转载 作者:行者123 更新时间:2023-11-30 16:09:28 24 4
gpt4 key购买 nike

因此,我可以使用 FD_ZEROFD_SETFD_ISSET 来搞乱文件描述符集。 select() 函数现在可用于观察某个文件对象是否变得可读(希望我的措辞在这里是正确的)。我想要做的是:从 stdin 读取字符序列,然后将该序列发送到服务器。不过,我在这里省略了一些套接字内容的错误消息,因为我的问题是关于 FD_ISSET 的。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet.in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{

static char buffer[256];
int sock_fd, length, port;
struct sockaddr_in server_addr;
fd_set input_fdset

sock_fd = socket(PF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
connect(sock_fd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in));


while (1)
{
FD_ZERO(&input_fdset);
FD_SET(STDIN_FILENO, &input_fdset);
FD_SET(sock_fd, &input_fdset);
if (select(sock_fd+1, &input_fdset, NULL, NULL, NULL) == -1)
perror("some error");
if (FD_ISSET(STDIN_FILENO, &input_fdset))
{
if(fgets(buffer, 256, stdin) == NULL)
{
printf("connect: Closing socket.");
break;
}
length = strlen(buffer);
send(sock_fd, buffer, length, 0);
}
else
{
length = recv(sock_fd, buffer, 256, 0);
if(length == 0)
{
printf( "Connection closed by remote host.");
break;
}
write(STDOUT_FILENO, buffer, length);
}
}
close(sock_fd);
return(0);
}

你可能会猜到我遇到了这段代码。我很难理解以下内容:在 while 循环中,我将套接字对象和标准输入添加到文件描述符集中。在下一步中,select 检查是否有任何内容可以从这两个对象中读取。那么 if(FD_ISSET(STDIN_FILENO, &input_fdset)) 应该总是被执行,对吧?我的意思是条件总是满足,因为我们使用 FD_SET(STDIN_FILENO, &input_fdset) 设置 STDIN_FILENO。现在,我处于这个 if 语句中。 fgets 逐行读取我的终端输入。当我用 ENTER 结束此输入时,一个换行符将附加到我的缓冲区中,并且从 stdin 的读取将停止。但只有在 while 循环再次执行之前,对吧?因为在这种情况下,fgets 也会再次被调用。顺便说一句,我认为仅在这个 if 语句中使用 fgets 有点奇怪。之前不应该调用吗? fgets 怎么会变成 NULL?仅当到达 EOF 且未读入任何字符时。但这不会发生,不是吗?当我从 stdin 读取时,我无法到达 EOF。我认为。现在最后一个问题:我什么时候执行 else block ?为此,之前的 if 语句需要失败。但正如我所说,if(FD_ISSET(STDIN_FILENO, &input_fdset) 永远不会失败。

Ofc 我意识到我误解了这段代码。有人可以帮我解决这个问题吗?

最佳答案

来自 select (man select) 的文档:

“返回时,select() 将给定的描述符集替换为由已准备好执行请求操作的描述符组成的子集。”

FD_ISSET 的目的是确定哪些集合已准备好读取。根据设计,该集合由 select 调用更改。

关于c - fgets 会更改文件描述符集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59136604/

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