linux中如何设置写文件超时

xSTONEx 2014-07-13 11:38:31
各位大神,linux中如果向磁盘中写文件时,受到外界因素的干扰使得写入速度变慢,如何设置写超时时间;,当写速度下将时,直接跳出写操作?
另看网上有资料说阻塞、非阻塞模式,我的理解是阻塞模式是你本来想写100字符,但缓存中不足100字符,因此无法返回,非阻塞是有多少写多少,完事返回,与我上述的问题不符,不知理解是否正确。
在线等大神赐教
...全文
593 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
colddown 2014-07-14
  • 打赏
  • 举报
回复
之前想的应该不对。你的写数据应该先到达page cache,之后write就返回了,不应当block。如果设备很慢,可能导致page cache里有大量dirty page并占用大量内存。你是想解决这个问题吗?
xSTONEx 2014-07-14
  • 打赏
  • 举报
回复
对的,本身产品的CPU到SATA这边的走线就不好,信号质量差,高低温等环境因素干扰的话,情况更糟,但这些因素都是不可改变的,只能在程序里做些牺牲。至于一秒一个字节只是假设,具体是多少也无法检测,总之是很慢,所以才想在很难写入的时候跳出写盘。 我看了下,非阻塞模式是针对l类似socket这样的终端文件描述符,对普通文件应该没用吧。
yuqing89320 2014-07-14
  • 打赏
  • 举报
回复
写入磁盘速度,可以软件控制么,貌似不可已 你说的受外界影响速度变慢,指的时温度过高之类的么 写入调度应该是系统调度控制的吧,不可能一秒只写一个字节,过慢,用select监听应该返回EAGAIN 个人理解,仅供参考
xSTONEx 2014-07-14
  • 打赏
  • 举报
回复
首先感谢楼上的大侠 我简化完程序后,应用层运行两个线程,一个采集数据,一个写数据,当采集线程写满缓存后给写数据线程发信号量, 从测试的结果看运行几个小时后,CPU达到100%,有连续几个释放信号量的打印,没有接收信号量的打印(正常情况释放和接收的打印是交替的) 由此可以看出是在write里一直无法返回。想解决的问题是发生上述情况是让write在规定的时间返回,系统可以正常运行。
colddown 2014-07-14
  • 打赏
  • 举报
回复
非阻塞情况下write应该立即返回。不是很确定用这个方法能解决你的问题,不过可以试试
xSTONEx 2014-07-13
  • 打赏
  • 举报
回复
自己先顶一下
xSTONEx 2014-07-13
  • 打赏
  • 举报
回复
1.select(...);//设置超时时间 . . . 2write(...);//写文件 按上述的步骤,如果写的很慢,write会返回吗? 之前用过select设置过socket的超时收发,但对select工作原理还是理解的不透彻,能详解写吗 谢谢。
colddown 2014-07-13
  • 打赏
  • 举报
回复
对于写文件select应该是当内核缓冲区有空间时返回,如果很久没有返回说明下面的数据传输有问题,导致缓冲区没用空闲,select就可以超时
xSTONEx 2014-07-13
  • 打赏
  • 举报
回复
我也想过用select,但个人理解select设置的超时时间是这样的,比如我原先要写100个字节,但缓存中就50个字节,所以阻塞了,通过select设置的超时时间可以退出,不知道我的理解是否正确 现在遇到的问题是缓存中有100个字节要写,但写盘速度一下变慢了,一秒一个字节(比如 说),此时该怎么做才能设置时间,写不完就不写了呢?
colddown 2014-07-13
  • 打赏
  • 举报
回复
可以用select函数,同时设置超时。如果在超时前文件还未准备好写就可以退出。

23,127

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧