C语言文件权限

2023-12-18 12:21:48

前言

提笔不会忘字的人,提键盘却忘了编程语言,差点忘本了,用python,shell等脚本语言忘记C语言怎么用了,研究文件系统简单的文件读写不会写了,记录一下。

简单的文件读写

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>

int main() {
    const char* filename = "example.txt";
    mode_t mode = 0666; // 文件权限模式

    int fd = open(filename, O_CREAT | O_WRONLY, mode);

    if (fd == -1) {
        perror("Failed to open or create file");
        return 1;
    }

    // 文件打开成功,可以进行写入操作
    const char* content = "Hello, World!";
    ssize_t bytes_written = write(fd, content, strlen(content));

    if (bytes_written == -1) {
        perror("Failed to write to file");
        return 1;
    }

    printf("Successfully written %ld bytes to file.\n", bytes_written);


    // 关闭文件
    if (close(fd) == -1) {
        perror("Failed to close file");
        return 1;
    }

    return 0;
}

在这里插入图片描述

细细分析

1.打开方式

open函数是一个在C语言中用于打开文件的系统调用函数。它提供了对文件的创建、打开和访问的功能。open函数的原型如下:

#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

open函数的参数如下:

  • pathname:要打开或创建的文件的路径名。
  • flags:指定打开文件的方式和行为的标志位。可以使用多个标志位,通过按位或 (|) 运算符进行组合。常用的标志位包括:
    • O_RDONLY:
      功能:以只读方式打开文件。
      示例:open(filename, O_RDONLY);
    • O_WRONLY:
      功能:以只写方式打开文件。
      示例:open(filename, O_WRONLY);
    • O_RDWR:
      功能:以读写方式打开文件。
      示例:open(filename, O_RDWR);
    • O_CREAT:
      功能:如果文件不存在,则创建文件。
      示例:open(filename, O_CREAT | O_WRONLY, mode);
      注意事项:通常与O_WRONLY或O_RDWR一起使用,并需要提供文件的权限模式(mode)参数。
    • O_EXCL:
      功能:与O_CREAT一起使用时,确保文件不存在,防止文件被覆盖。
      示例:open(filename, O_CREAT | O_WRONLY | O_EXCL, mode);
      注意事项:如果文件已经存在,带有O_EXCL标志的open()函数调用将失败返回。
    • O_TRUNC:
      功能:如果文件存在并成功打开,则将其截断为空文件(清空文件内容)。
      示例:open(filename, O_WRONLY | O_TRUNC);
    • O_APPEND:
      功能:在文件末尾追加写入内容,而不是覆盖现有内容。
      示例:open(filename, O_WRONLY | O_APPEND);
    • O_NONBLOCK:
      功能:以非阻塞方式(非等待方式)打开文件,读写操作可能会立即返回。
      示例:open(filename, O_RDONLY | O_NONBLOCK);
    • O_SYNC:
      功能:要求每次写入文件时都要进行物理磁盘同步,确保数据写入磁盘后再返回。
      示例:open(filename, O_WRONLY | O_SYNC);

- mode:只有在使用O_CREAT标志位创建新文件时才需要指定。它用于设置新文件的权限模式(文件的访问权限)。如果不使用O_CREAT标志位,则可以将mode参数省略。

open函数返回一个整数值,表示文件描述符(file descriptor)。如果打开或创建文件失败,返回值为-1,并设置全局变量errno以指示错误的类型。

2.文件权限

文件权限模式选项用于设置文件的读取、写入和执行权限。在UNIX/Linux系统中,可以使用以下选项来设置文件权限模式:

  • S_IRUSR:
    功能:文件所有者的读权限。
    值:0400(八进制)。
  • S_IWUSR:
    功能:文件所有者的写权限。
    值:0200(八进制)。
  • S_IXUSR:
    功能:文件所有者的执行权限。
    值:0100(八进制)。
  • S_IRGRP:
    功能:文件所属组的读权限。
    值:0040(八进制)。
  • S_IWGRP:
    功能:文件所属组的写权限。
    值:0020(八进制)。
  • S_IXGRP:
    功能:文件所属组的执行权限。
    值:0010(八进制)。
  • S_IROTH:
    功能:其他用户的读权限。
    值:0004(八进制)。
  • S_IWOTH:
    功能:其他用户的写权限。
    值:0002(八进制)。
  • S_IXOTH:
    功能:其他用户的执行权限。
    值:0001(八进制)。
  • S_IRWXU:
    功能:用户(拥有者)具有读、写和执行权限。
    值:0700(八进制)。
  • S_IRWXG:
    功能:组具有读、写和执行权限。
    值:0070(八进制)。
  • S_IRWXO:
    功能:其他用户具有读、写和执行权限。
    值:0007(八进制)。

这些选项可以通过按位或运算符(|)组合使用,以设置所需的权限模式。例如,要为文件设置所有者具有读和写权限,而其他用户仅具有读权限,可以使用以下模式:

mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;

如果使用777即为:

mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO;

可以使用%o,进行输出查看mode的值。

#include <sys/stat.h>
#include <stdio.h>

int main() {
    mode_t mode = S_IRWXU; // 设置文件所有者的权限为读、写和执行

    printf("Mode: %o\n", mode);

    return 0;
}

3.chmod给文件权限

在C语言中,可以使用chmod函数来修改文件的权限。chmod函数的原型如下:

#include <sys/stat.h>

int chmod(const char *pathname, mode_t mode);

chmod函数接受两个参数:

  • pathname:要修改权限的文件路径名。
  • mode:要设置的文件权限模式。
#include <sys/stat.h>
#include <stdio.h>

int main() {
    const char* filename = "example.txt";
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; // 设置文件权限为 640
    if (chmod(filename, mode) == -1) {
        perror("Failed to change file permissions");
        return 1;
    }

    printf("File permissions changed successfully.\n");

    return 0;
}

文章来源:https://blog.csdn.net/weixin_43912621/article/details/135055061
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。