超时 fwrite 调用以防止其阻塞
Timeout fwrite call to keep it from blocking
有没有一种方法可以防止fwrite阻塞,比如说使用超时?
场景是这样的:我需要在网络上进行 fwrite 调用(因为我在很大程度上重用了代码,我需要坚持下去(。但是,如果我拔掉网线,fwrite 就会阻塞。有解决方法吗?任何帮助/建议将不胜感激。
将基础文件描述符切换到非阻塞模式:
int fd = fdnum(stream);
int f = fcntl(fd, F_GETFL, 0);
f |= O_NONBLOCK;
fcntl(fd, F_SETFL, f);
在此之后,如果文件描述符尚未准备好写入,则对 fwrite()
的调用将立即返回并将errno
设置为 EAGAIN。在循环中调用它并使用睡眠,您可以轻松实现所需的任何超时行为。
这应该与@Alexander巴库林的建议具有相同的效果,但要短一些。
int fd = fdnum(stream);
int ioctl( fd, FIONBIO, 1 );
参考: http://oss.org.cn/ossdocs/gnu/linux/syscalls_17.html
您可以设置信号处理程序并使用alarm()
系统调用来计划该信号的传递,这将中断fwrite()
调用。 典型用法如下所示:
signal(SIGALRM, handle_sigalrm);
received_alarm = 0;
alarm(10);
...some blocking operation...
alarm(0); // cancel the alarm.
if (received_alarm) {
// command timed out
} else {
// command completed successfully
}
这假定 handle_sigalrm()
是一个在调用时设置received_alarm
全局变量的函数。谷歌有一些例子。
这绝对不是处理此问题的最佳方法,但如果您被迫使用 fwrite()
,这可能是您唯一的选择。 更好的解决方案是使用 select()
或 poll()
循环和非阻塞套接字,但这可能需要对代码进行大量重新设计。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- 如果要显式指定缓冲区大小,应使用 Fread/FWRITE 还是读/写系统调用
- 超时 fwrite 调用以防止其阻塞