linux锁定文件的命令 linux锁定文件禁止修改( 三 )


chown 改变文件或目录的属主(所有者)
chown 用户名文件名或目录名
chown用户名.组名文件名或目录名
修改所属组也可用chgrp 命令来完成
当你用ls -l 查看到文件的属主、属组为数字时 , 就表明该文件的创建用户已被删除 。
文件的特殊权限
chattr +i(-i) 文件名锁定文件(取消锁定)不可删除与清空
chattr +a(-a) 文件名添加内容(只可添加内容)
使用lsattr文件名查看文件的特殊权限
由此可以看出
root用户默认创建的目录权限是755,文件权限是644
普通用户默认创建的目录权限是775,文件权限是664
这也是系统默认的比较安全的权限分配,其实这些默认权限全部都是由umask值来决定的
系统规定了
文件的权限值是从666开始计算(默认权限=权限值-umask值)
目录的权限值是从777开始计算(默认权限=权限值-umask值)
文件1的权限=444 (666-232=434——43(3+1)4)
linux文件锁定被使用一、什么是文件锁定
对于锁这个字,大家一定不会陌生,因为我们生活中就存在着大量的锁,它们各个方面发挥着它的作用 , 现在世界中的锁的功能都可归结为一句话 , 就是阻止某些人做某些事,例如,门锁就是阻止除了屋主之外的人进入这个房子 , 你进入不到这个房子,也就不能使用房子里面的东西 。
而因为程序经常需要共享数据,而这通常又是通过文件来实现的,试想一个情况,A进程正在对一个文件进行写操作,而另一个程序B需要对同一个文件进行读操作,并以读取到的数据作为自己程序运行时所需要的数据,这会发生什么情况呢?进程B可能会读到错乱的数据 , 因为它并不知道另一个进程A正在改写这个文件中的数据 。
为了解决类似的问题,就出现了文件锁定,简单点来说 , 这是文件的一种安全的更新方式,当一个程序正在对文件进行写操作时 , 文件就会进入一种暂时状态,在这个状态下,如果另一个程序尝试读这个文件,它就会自动停下来等待这个状态结束 。Linux系统提供了很多特性来实现文件锁定,其中最简单的方法就是以原子操作的方式创建锁文件 。
用回之前的例子就是,文件锁就是当文件在写的时候,阻止其他的需要写或者要读文件的进程来操作这个文件 。
二、创建锁文件
创建一个锁文件是非常简单的,我们可以使用open系统调用来创建一个锁文件,在调用open时oflags参数要增加参数O_CREAT和O_EXCL标志,如file_desc = open("/tmp/LCK.test", O_RDWR|O_CREAT|O_EXCL, 0444);就可以创建一个锁文件/tmp/LCK.test 。O_CREAT|O_EXCL , 可以确保调用者可以创建出文件 , 使用这个模式可以防止两个程序同时创建同一个文件,如果文件(/tmp/LCK.test)已经存在,则open调用就会失败,返回-1 。
如果一个程序在它执行时,只需要独占某个资源一段很短的时间,这个时间段(或代码区)通常被叫做临界区 , 我们需要在进入临界区之前使用open系统调用创建锁文件,然后在退出临界区时用unlink系统调用删除这个锁文件 。
注意:锁文件只是充当一个指示器的角色,程序间需要通过相互协作来使用它们,也就是说锁文件只是建议锁,而不是强制锁,并不会真正阻止你读写文件中的数据 。
可以看看下面的例子:源文件文件名为filelock1.c,代码如下:
#include unistd.h #include stdlib.h #include stdio.h #include fcntl.h #include errno.h int main() { const char *lock_file = "/tmp/LCK.test1"; int n_fd = -1; int n_tries = 10; while(n_tries--) { //创建锁文件 n_fd = open(lock_file, O_RDWR|O_CREAT|O_EXCL, 0444); if(n_fd == -1) { //创建失败 printf("%d - Lock already present ", getpid()); sleep(2); } else { //创建成功 printf("%d - I have exclusive access ", getpid()); sleep(1); close(n_fd); //删除锁文件,释放锁 unlink(lock_file); sleep(2); } } return 0; }

推荐阅读