Linux系统中不仅仅有文件,还有用来给文件分类目录,也就是常说的文件夹。文件夹也有对应的读写和执行权限。
目录读权限:可以列出目录下的文件,如使用ls命令查看文件夹下有哪些文件。
目录写权限:可以在目录下创建和删除文件或者文件夹。
目录执行权限:可以在目录下执行程序或者脚本,但无法查看文件夹下有哪些可执行文件。
针对执行权限,下面来做一个测试,使用root用户创建一个05_elf2_cmddemo_directory文件夹,赋予一个711权限,并在文件夹下创建test.sh文件,文件功能为执行时会打印“hello world!
# ls
test.sh
现在切回elf用户进入05_elf2_cmddemo_directory文件夹中开始测试。
$ ls
ls: cannot open directory '.': Permission denied
$ ./test.sh
hello world!
可以看到在执行ls命令时无法列出05_elf2_cmddemo_directory文件夹下的内容,但是如果知道此文件夹下有哪些可执行文件可以直接手打出来执行。如上图的操作,执行成功,并打印出hello world!”。
access
用于检查进程对指定文件或目录的访问权限的系统调用。它可以检查文件是否存在以及当前用户是否具有某种权限(如读、写或执行权限)。
1.头文件
#include <unistd.h>
2.函数原型
int access(const char *pathname, int mode);
3.参数
1pathname指向要检查的路径名的指针。
2mode表示要检查的访问权限的类型,它可以是以下值的组合:
⚫F_OK: 检查文件是否存在。
⚫R_OK: 检查是否具有读取权限。
⚫W_OK: 检查是否具有写入权限。
⚫X_OK: 检查是否具有执行权限。
除了以上单个使用,也可以使用“|”进行组合使用,如:
⚫R_OK | W_OK: 检查读取和写入权限。
⚫R_OK | X_OK: 检查读取和执行权限。
4.返回值
成功返回0,失败返回-1。需要注意的是,如果使用组合使用,只要其中一项不通过,就会返回-1.
5.示例:(使用access检查文件权限
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
const char *file="file_rw.txt";
int res=0;
printf("flie name:%s\n",file);
res = access(file, F_OK);
if (res == 0)
printf("File exists: OK\n");
else {
printf("File exists: NO\n");
exit(0);
}
res = access(file, R_OK);
if (res == 0)
printf("Read permission: OK\n");
else
printf("Read permission: NO\n");
res = access(file, W_OK);
if (res == 0)
printf("Write permission: OK\n");
else
printf("Write permission: NO\n");
res = access(file, X_OK);
if (res == 0)
printf("Execution permission: OK\n");
else
printf("Execution permission: NO\n");
exit(0);
}
6.创建测试文件并改修权限为766,增加读写权限
$ touch file_rw.txt
$ chmod 643 file_rw.txt
$ ll file_rw.txt
-rw-r---wx 1 elf forlinx     0  823 15:56 file_rw.txt*
7.测试结果
$ ./access_test
flie name:file_rw.txt
File exists: OK
Read permission: OK
Write permission: OK
Execution permission: NO
可以看到文件的执行结果,打印出了测试文件名为file_rw.txt,测试文件存在且有读写权限,并没有执行权限。
chmod
用于更改文件或目录的权限。
1.头文件
#include <sys/stat.h>
2.函数原型
int chmod(const char *pathname, mode_t mode);
3.参数
pathname:指向要检查的路径名的指针。
mode:一个表示新权限的模式值,通常是一个整数,它使用位掩码的形式来表示。
这里的mode值可以参考文件权限章节开头的表格。这里需要说明的是这些权限可以使用位运算符组合起来。如:
mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP
4.返回值
成功返回0,错误返回-1
5.示例:(使用chmod函数更改文件权限)
#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
void permissions_printf(const char *path)
{
struct stat file_info;
if (lstat(path, &file_info) < 0) {
exit(EXIT_FAILURE);
}
printf("File: %s\n", path);
printf("Permissions: ");
printf((S_ISDIR(file_info.st_mode)) ? "d" : "-");
printf((file_info.st_mode & S_IRUSR) ? "r" : "-");
printf((file_info.st_mode & S_IWUSR) ? "w" : "-");
printf((file_info.st_mode & S_IXUSR) ? "x" : "-");
printf((file_info.st_mode & S_IRGRP) ? "r" : "-");
printf((file_info.st_mode & S_IWGRP) ? "w" : "-");
printf((file_info.st_mode & S_IXGRP) ? "x" : "-");
printf((file_info.st_mode & S_IROTH) ? "r" : "-");
printf((file_info.st_mode & S_IWOTH) ? "w" : "-");
printf((file_info.st_mode & S_IXOTH) ? "x" : "-");
printf("\n");
}
int main(){
const char *file = "chmod_file.txt";
mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWOTH;
printf("Source Permissions\n");
permissions_printf(file);
chmod(file, mode);
printf("\nChange Permission:\n");
permissions_printf(file);
}
6.测试结果
Source Permissions
File: chmod_file.txt
Permissions: -rw-r--r--
Change Permission:
File: chmod_file.txt
Permissions: -rwxr---w-
可以看到修改的文件名称为chmod_file.txt,原权限为文件拥有者有读写权限,同组用户有读权限,其他用户也是读权限。修改后变为文件拥有者有读写执行权限,同组用户支持读权限,其他用户支持写权限。

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Powered by Discuz! X3.5  © 2001-2013 Comsenz Inc.