见证超级用户的超级权限

    今天,某同事向我反应,我写的程序有问题。出问题的大致功能是这样的,我需要在不修改原文件的情况下,备份一个新的文件出来(新文件最后一小部分内容还保存在内存)。实现方法的方法很简单,读取旧文件,然后将内容写到新文件,读取完旧文件后,再将内存部分内容写到新文件。现在问题出来了,备份的新文件比旧文件小很多,只看到一小部分内容(我猜是原先保存在内存的那部分)。在同事的电脑上测试,每次都可以重现,但我在我的电脑上测试总是无法重现。没办法,只能在单元测试工具上添加一个unit test case来跟踪测试。重现了,可以重现了,仔细跟踪,原因是这样的...
    首先,为了不让其他线程修改新文件,我以mode为0的模式打开新文件(假设名叫file1,如果文件不存在,就创建一个),然后往里面写内容,直到写完内容(还有一小部分保存在内存)。当需要备份file2文件打开file1时,打开文件失败(因为mode为0,无可读不可写),导致无法备份file1文件里的内容,只保存了内存部分。那为什么同事电脑上每次都可以重现,而我的电脑上却不能重现呢。这就是超级用户的超级权限,我的电脑上使用的是root用户测试,而同事使用的是普通用户。看个例子就知道了(使用普通用户和root用户分别创建一个文件,改mode为0,再读取该文件,结果root可以读,而普通用户不可以读)
//测试普通用户

[welkin@dev91 ~]$ cd /tmp/
[welkin@dev91 /tmp]$ touch welkin
[welkin@dev91 /tmp]$ chmod 000 welkin
[welkin@dev91 /tmp]$ cat welkin 
cat: welkin: 权限不够
[welkin@dev91 /tmp]$ 

 

//测试root用户

[root@dev91 tmp]# touch root
[root@dev91 tmp]# chmod 000 root
[root@dev91 tmp]# cat root 
[root@dev91 tmp]# 

 
看两个文件的mode全部是0

[welkin@dev91 /tmp]$ ll root welkin 
----------  1 root   root   0  4月 22 19:03 root
----------  1 welkin welkin 0  4月 22 19:02 welkin
[welkin@dev91 /tmp]$ 

 

这就是超级用户的超级权限,通过这个例子看出,即使改mode为0,当用root运行程序,其他线程也可以读的。如果不想让其他线程读,应该对文件加个线程锁,而不是把mode改为0。
总之,把文件的mode改为0是不安全的,可能会出现想让其他进程读的却读不了,而不想让其他线程读的,却可以读取到了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值