首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数工作定时器

问函数工作定时器
EN

Stack Overflow用户
提问于 2012-05-30 21:00:48
回答 4查看 140关注 0票数 0

我有一个从socket接收数据的函数,我需要在5秒后停止函数,而不创建额外的线程。我的代码:

代码语言:javascript
复制
void TestReceive()
{
 //how to stop code below when 5 second passed&
 size_t received = 0;
 while (received < 4)
 {
  ssize_t r = read(fd, buffer, 4);
  if (r <= 0) break;
  received += r;
 }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-30 21:03:12

使用select(),它将被阻塞,直到有东西可读,或者最多在timeval中指定的时间内,如下所示。

代码语言:javascript
复制
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

select()不读也不写,它所做的是针对一组描述符(readfds、writefds和/或exceptfds),它将等待/阻塞,直到发生以下情况之一:

  • 有一个描述符准备从

中读取

  • 有一个描述符准备写入
  • 其中一个描述符有一个异常,例如,如果指定了超时,当配置的时间过期时,它已关闭
  • <

>F210

如果您只需要“等待”(休眠)5秒,然后读取,那么您可以休眠5秒(linux上的usleep()),然后通过设置套接字选项或使用最小超时调用select()进行非阻塞读取,并检查是否有要读取的内容。

这里有一个相关的问题。How C++ select() function works in Unix OSs?

票数 2
EN

Stack Overflow用户

发布于 2012-05-30 21:08:57

正如@Brady所建议的,select()将会起作用

还可以设置套接字选项setsockopt(s, SOL_SOCKET, SO_RCVTIMEO ...

票数 1
EN

Stack Overflow用户

发布于 2012-05-30 21:06:07

记录循环开始前的当前时间。在每次迭代时-检查是否已过5秒-如果是-中断;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10816830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档