1.ls -l 打印出来的权限列表
(1)一个文件有9位权限,3个为一组,第一组表示文件的属主(user、owner)对该文件的可读可写可执行权限,第二组表示属主所在组(group)的这些权限,第3组表示其他用户(others)对该文件的这些权限。
(2)属主就是这个文件属于谁,一般来说文件属主就是创建该文件时用的那个用户,但是我们创建之后还可以用chown命令改变文件的属主,还可以用chgrp修改一个文件的所在组。
2.文件操作时的权限检查规则
(1)一个程序a.out被执行,a.out试图去操作一个文件1.txt,这时如何判断a.out对1.txt的操作权限。
(2)判断方法:首先1.txt具有9个权限位(user、group、others·)对该文件的操作权限,主要是看a.out被谁执行,也就是当前程序(进程)是哪个用户的进程。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define FILENAME "1.txt"
int main()
{
int fd1 = -1;
fd1 = open(FILENAME,O_RDONLY);
if(fd1 > 0)
{
printf("只读\n");
close(fd1);
}
else
{
perror("read");
}
fd1 = open(FILENAME,O_WRONLY);
if(fd1 > 0)
{
printf("只写\n");
close(fd1);
}
else
{
perror("write");
}
return 0;
}
补充:可以通过chmod u-r 文件名)(给这个文件的属主去掉可读权限),同理可以按照这种命令可以给文件加减其他权限
3.access函数检查权限设置
(1)一般很难确认某个文件有某种权限,设计某个优秀的软件应该是:在操作某个文件之前先判断当前是否有这个权限操作,如果没有则提示错误。
(2)access函数可以测试得到当前执行的那个用户在当前那个环境下对目标文件是否具有某种操作权限。
#include <stdio.h>
#include <unistd.h>
#define NAME "1.txt"
int main(void)
{
int ret = -1;
ret = access(NAME,F_OK);
if(ret < 0)
{
printf("文件不存在\n");
return -1;
}
else
{
printf("文件存在\n");
}
ret = access(NAME,R_OK);
if(ret < 0)
{
printf("文件不可读\n");
}
else
{
printf("文件可读\n");
}
ret = access(NAME,W_OK);
if(ret < 0)
{
printf("文件不可写\n");
}
else
{
printf("文件可写\n");
}
ret = access(NAME,X_OK);
if(ret < 0)
{
printf("文件不可执行\n");
}
else
{
printf("文件可执行\n");
}
return 0;
}
4.chmod/fchmod与权限修改
(1)chmod是一个linux命令,用来修改文件的各种权限。chmod只能root用户才能去执行修改。
(2)chmod命令其实是linux内部的chmod的API实现的
(3)chmod是从硬盘里面读取文件修改权限,而fchmod是从内存中已打开的文件中去修改。
#include <stdio.h>
#include <sys/stat.h>
int main(int argc,char *argv[])
{
int ret = -1;
if(argc != 2)
{
printf("usage : %s filename\n",argv[0]);
return -1;
}
//int chmod(const char *pathname, mode_t mode);
ret = chmod(argv[1],S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IROTH);
if(ret < 0)
{
perror("chmod");
return -1;
}
return 0;
}
5.chown/fchown/lchown与属主修改
(1)linux中有chown命令来修改属主,也是通过内部API实现的。
chown 修改到的属主名 要修改的文件
chgrp 修改到的组名 要修改的文件
6.umask与文件权限掩码
(1)文件掩码是linux系统的维护的全局设置,umask的作用是用来设置新建文件的默认权限。
(2)用umask命令查看umask掩码,umask后面跟掩码号修改umask的掩码号。