linuxcan程序write每次只能打一包

linuxcan程序write每次只能打一包,第1张

linux write 数据

linux write 数据,write每次最大能写多少字节的数据

北美黑胡桃

转载

关注

0点赞·576人阅读

背景

最近碰到一个线上的bug,具体情况是进程将24G左右的内存buffer写到磁盘上,但是每次write都写不完24G,然后重试导致磁盘写满,服务不可用。

在修这个bug的时候,对于到底write最大能写多少字节的数据斗模卖产生了浓厚的兴趣,写了一个测试程序基本上每次最多写到2G多一点。

在研究了一段内核代码后一切霍然开朗。

write限制

write函数在以下三种情况下可能写入的字节数小于指定的字节数:

在底层的物理介质上没有足够的空间

RLIMIT_FSIZE的限制

写入被信号打断

从内核代码来看,count在大于MAX_RW_COUNT的情况下,会赋值为MAX_RW_COUNT

而MAX_RW_COUNT是一个宏,展开为:INT_MAX &PAGE_MASK

INT_MAX也是一个宏,展开为((int)(~0U>>1)),也就是无符号数0取反后右移一位转换成int类型,也就是2^31.

PAGE_MASK也是一个空逗宏,展开为(~(PAGE_SIZE-1)),而PAGE_SIZE展开为(_AC(1,UL) <<PAGE_SHIFT),PAGE_SHIFT的值为12,也就是每页的大小是212,也就是说1左移12位,PAGE_SIZE的值为212,码誉然后PAGE_SIZE-1取反

最后MAX_RW_COUNT的值为INT_MAX &PAGE_MASK,也就是说MAX_RW_COUNT的值是int的最大值最后12位屏蔽掉,保持4K地址对齐

所以理论上讲,每次write可写的buff大小是231-212=2147479552,这也是与实际的测试结果相一致

can盒刷程序端口打开错嫌态误可能是因为保护措施不够。可以据损坏的情况适当增加一些措施来保护电路。如下图所示是典型的保护电路图,电源端口有TVS保护,CAN接口有晌唤三级电路保护,可芹谨源以抑制大能量的雷击浪涌。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12240928.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存