请高手指点,system调用cp文件夹A到B,得到的B下面好多文件大小为0

heronism 2015-01-24 11:55:52
Cent-OS 6.5上,程序test调用系统调用system,cp -rf A B,test本身位于A下面某个子目录,且test打开了A下面的好几个文件,
在执行system调用拷贝之后调用reboot进行了重启,重启后发现得到的B文件夹里好些文件大小为0。
此问题不是必现的,但是出现的频率也不低。有几次应该是磁盘空间不够引起的,更多的几次用df命令查看磁盘空间很充分,应该不是空间的问题。

分析思路:
1.system系统调用应该是阻塞式的,即肯定是拷贝结束之后才执行下面的命令
2.reboot命令是在cp命令执行完毕之后的几秒之后执行的,应该不会有影响
3.排除了磁盘空间不够的问题

请高手帮忙指点下思路,是否与拷贝的目录下有正在被打开的文件有关,但是我用了-rf参数应该是可以拷贝的啊。

请高手赐教,多谢!
...全文
376 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly 100% 2015-02-16
  • 打赏
  • 举报
回复
-p 试试看 不然就看看权限
heronism 2015-02-16
  • 打赏
  • 举报
回复
根据最新的测试发现,可能和重启有关。现在打算在重启前进行sync,之后再重启。虽然reboot应该是调用sync了,还是人为地保证一下为好。
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
1)linux下好象默认就是共享打开的。 FOPEN Section: Linux Programmer's Manual (3 ) Updated: 2002-01-03 …… Any created files will have mode S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH (0666), as modified by the process' umask value (see umask(2)). 2)“确认让test每次调用文件操作相关函数之后都检查了该函数的返回值。”指的是test程序中的所有文件操作(system不算文件操作)。 不要瞎猜。要判断每个函数的返回值。嫌cp命令没返回值可判断的话,参考cp命令对应的源代码,在test中不通过system函数调用cp,直接模仿cp命令的实现,调用更底层的函数实现文件拷贝,且检查每个函数的返回值。
heronism 2015-01-29
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
确认让test每次调用文件操作相关函数之后都检查了该函数的返回值。
1)linux下的独占打开、共享打开具体意味着什么,没搜到这方面资料 2)您所说的“确认让test每次调用文件操作相关函数之后都检查了该函数的返回值。”指的是system调用,还是所有文件操作。 test打开的文件本身有大小(不是0),test即使不进行fflush也不应该时是0 确实非常诡异
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
确认让test每次调用文件操作相关函数之后都检查了该函数的返回值。
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
"且test打开了A下面的好几个文件" 确认让test使用共享打开而不要使用独占打开A下面的好几个文件。 确认让test每次写文件操作之后都调用了fflush。

23,120

社区成员

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

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