gpt4 book ai didi

c - select() 在长时间运行后立即超时 (C++)

转载 作者:行者123 更新时间:2023-12-03 11:52:28 25 4
gpt4 key购买 nike

大多数情况下,这段代码工作得很好。但有时当可执行文件运行了一段时间后, select() 似乎立即超时,然后进入一个奇怪的状态,它不断被调用,立即超时,一遍又一遍。然后它必须从外面被杀死。

我的猜测是标准输入超时更改的方式有问题 - 这就是 select 阻塞的原因。

在 StackOverflow 上环顾四周,大多数人的 select() 问题似乎通过确保每次都使用宏(FD_ZERO 和 FD_SET)进行重置并使用正确的初始参数进行选择来解决。我不认为这些是这里的问题。

int            rc     = 0;
fd_set fdset;
struct timeval timeout;

// -- clear out the response -- //
readValue = "";

// -- set the timeout -- //
timeout.tv_sec = passedInTimeout; // 5 seconds
timeout.tv_usec = 0;

// -- indicate which file descriptors to select from -- //
FD_ZERO(&fdset);
FD_SET(passedInFileDescriptor, &fdset); //passedInFileDescriptor = 0

// -- perform the selection operation, with timeout -- //
rc = select(1, &fdset, NULL, NULL, &timeout);


if (rc == -1) // -- select failed -- //
{
result = TR_ERROR;
}
else if (rc == 0) // -- select timed out -- //
{
result = TR_TIMEDOUT;
}
else
{
if (FD_ISSET(mFileDescriptor, &fdset))
{
if(rc = readData(readValue) <= 0)
{
result = TR_ERROR;
}
} else {
result = TR_SUCCESS;
}
}

最佳答案

请注意,“选择”的某些实现严格适用于规范:
“nfds 是三个集合中任何一个中编号最大的文件描述符,加 1”。
因此,您最好将“1”更改为“passedInFileDescriptor+1”作为第一个参数。
我不知道这是否可以解决您的问题,但至少您的代码变得更加......呃......“传统”;)

再见

关于c - select() 在长时间运行后立即超时 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5518010/

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