gpt4 book ai didi

c - 更新 select() 调用中的超时值

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:29 24 4
gpt4 key购买 nike

我想使用 select() 实现一个计时器,我希望它在每 3 秒的间隔后达到超时代码。

如果我删除“timeout.tv_sec+=8;”根据我的代码,它等待 3 秒,然后开始连续打印“超时”,并且“timeout.tv_sec+=8”没有打印任何内容,程序卡住了。什么都没有打印出来。有人可以解释一下我在这方面做错了什么吗?我的代码如下:基本上,我希望它以 3 秒的间隔打印超时。

struct timeval timeout;
timeout.tv_sec = 3;
while(1) {
int rc = select(2, NULL, NULL, NULL, &timeout);
if(rc == 0)
{
printf(" time out ");
timeout.tv_sec+=8;
}
if (rc < 0)
{
printf(" Error ");
continue;
}
else
{
printf(" process ");// some instructions
}
}

最佳答案

您只需要重置您的超时值。在 select 返回之前,超时值被更新。然后它只包含剩余时间。

如果你根本不更新,你会遇到以下问题:

一旦时间用完,您会在接下来的每个调用中立即达到超时。

如果您使用 +=8 进行更新,您将增加剩余的超时时间。如果您还剩 2.5 秒,它会变成 10.5 秒,依此类推。

为避免这种情况,只需再次将其设置为 3s:

while(1) {
int rc = select(2, NULL, NULL, NULL, &timeout);
timeout.tv_sec = 3;
...

顺便说一句:如果您提供一些文件描述符以选择您要等待的文件,您可能会得到更好的结果。

另一个观察:

您不会在 printf 调用中添加 \n。这不会触发刷新您的 stdout。您可能会打印所有内容,但它不会从缓冲区移动到终端。

关于c - 更新 select() 调用中的超时值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47572257/

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