linux timeout函数,Linux下select()中的timeout的设置与不设置问题

Linux下的select,注意咯,不是pselect。

select()函数的最后一个参数是timeout,用来设置超时用的。

用的是一个struct timeval结构,需要用到sys/time.h文件。

struct timeval {

long tv_sec; 秒

long tv_usec; 毫毛

}

设置了timeout的值之后呢,select在没有文件描述符监视可用的情况下,会等待这个timeout的时间,时间到了select返回0

如果timeout超时之前有文件描述符可用,则返回可用的数量,这时候的timeout则会依然计数,因此如果想要每次都超时一定的时间那么在slelect返回>0的值之后要重新装填timeout的值一次。www.linuxidc.com以保证超时时间没有变化。

如果tv_sec和tv_usec都是0,那么就是超时时间为0,那么select就会立刻返回了。

如果timeout这里是个NULL,那么超时就未被启用,会一直阻塞在监视文件描述符的地方。

在pselect中的timeout更牛X

用到了struct timespec {

long tv_sec; 秒

long tv_nsec; 纳秒

}

时间更精确。

当然了系统做不了这么精确的事情,一般Linux的系统精度也就是10ms左右了。

这里说的重点在于timeout的值的选择和处理上。

另外遇到的一个问题是信号SIGALRM会使得select返回-1并置errno为EINTR。但这个信号已经被我的sigaction干掉了函数处理了,这个问题还需要研究一下。0b1331709591d260c1c78e86d0c51c18.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux select 函数可以用于监视多个文件描述符的状态变化,从而实现 IO 多路复用。如果你想在 select 函数设置一个超时时间,可以在 timeout 参数指定一个非零值。timeout 参数的类型是 struct timeval,它包含两个字段:tv_sec 和 tv_usec,分别表示超时的秒数和微秒数。 下面是一个使用 select 函数设置超时时间的例子: ```c #include <sys/select.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { fd_set readfds; FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); struct timeval timeout; timeout.tv_sec = 5; timeout.tv_usec = 0; int ret = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &timeout); if (ret == -1) { perror("select error"); exit(EXIT_FAILURE); } else if (ret == 0) { printf("select timeout\n"); } else { if (FD_ISSET(STDIN_FILENO, &readfds)) { printf("data is available now.\n"); } } return 0; } ``` 在上面的例子,我们使用 FD_ZERO 宏和 FD_SET 宏来初始化和设置文件描述符集合 readfds。然后,我们设置一个超时时间为 5 秒,调用 select 函数来等待标准输入文件描述符的可读事件。如果在超时时间内没有事件发生,select 函数将返回 0,程序输出 "select timeout"。如果标准输入文件描述符变为可读状态,select 函数将返回 1,程序输出 "data is available now."。 注意,select 函数timeout 参数是可选的,如果你不想设置超时时间,可以将 timeout 参数设置为 NULL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值