Linux系统程序设计——文件操作

stat结构体

在这里插入图片描述

文件属性操作函数

在这里插入图片描述
在这里插入图片描述

文件属性查看

在这里插入图片描述

  • node 索引节点编号:544365
  • 文件类型 :文件类型是’-’,表示这是一个普通文件
  • 文件权限:rw-r–r-- 表示文件可读、可写、可执行,文件所归属的用户组可读可执行,其他用户可读可执行
  • 硬链接个数:表示a.txt这个文件没有其他的硬链接,因为连接数是1,就是他本身
  • 文件属主:表示这个文件所属的用户,这里的意思是a.txt文件被root用户拥有,是第一个root
  • 文件属组:表示这个文件所属的用户组,这里表示a.txt文件属于root用户组,是第二个root
  • 文件大小:文件大小是3个字节
  • 文件修改时间:这里的时间是该文件最后被更新(包括文件创建、内容更新、文件名更新等)的时间可用如下命令查看文件的修改、访问、创建时间
/******************************************************
 * Descrition:通过lstat获取文件状态,并通过宏判断文件类型
 ******************************************************/
void exmaple1(int argc, char* argv[])
{
    if (argc < 2) {
        fprintf(stderr, "usage: %s files\n", argv[0]);
        exit(-1);
    }
    int i;
    struct stat buff;
    for (i = 1; i < argc; i++) {
        memset(&buff, 0, sizeof(buff));
        if (lstat(argv[i], &buff) < 0) {
            perror("lstat error!");
            continue;
        }
        printf("%-20s", argv[i]);
        //判断文件类型
        if (S_ISREG(buff.st_mode)) {
            printf("normal file\n");
        } else if (S_ISDIR(buff.st_mode)) {
            printf("directoty\n");
        } else if (S_ISBLK(buff.st_mode)) {
            printf("block device!\n");
        } else if (S_ISCHR(buff.st_mode)) {
            printf("character device\n");
        } else if (S_ISSOCK(buff.st_mode)) {
            printf("socket device!\n");
        } else if (S_ISFIFO(buff.st_mode)) {
            printf("named pipe\n");
        } else if (S_ISLNK(buff.st_mode)) {
            printf("link file\n");
        }
    }
}

文件权限

在这里插入图片描述

//设置文件权限
int fd=open("tmp.txt",O_WRONLY|OCREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
//也可以通过八进制设置
int fd=open("tmp.txt",O_WRONLY|OCREAT,0644)
0644:
6:文件拥有者 转换成二进制  0 1(r) 1(w) 0(x),代表文件拥有者的权限是可读可写
4:同组人  转换二进制  0 1(r) 0(w) 0(x),代表同组人权限是只读的
4:其他人 转换二进制  0 1(r) 0(w) 0(x),代表其他人权限是只读的

access函数

在这里插入图片描述

/***********************************************************
 *Description:通过access函数判断文件操作权限
 * **********************************************************/
void example2(int argc, char* argv[])
{
    if (argc < 2) {
        fprintf(stderr, "usage: %s files\n", argv[0]);
        exit(-1);
    }
    for (int i = 1; i < argc; i++) {
        if (access(argv[i], F_OK)) {
            printf("%s is not exist\n", argv[i]);
        }

        if (access(argv[i], R_OK)) {
            printf("%d can not read %s\n", getpid(), argv[i]);
        } else {
            printf("%d can  read %s\n", getpid(), argv[i]);
        }

        if (access(argv[i], W_OK)) {
            printf("%d can not write %s\n", getpid(), argv[i]);
        } else {
            printf("%d can  write %s\n", getpid(), argv[i]);
        }

        if (access(argv[i], X_OK)) {
            printf("%d can not excute %s\n", getpid(), argv[i]);
        } else {
            printf("%d can  excute %s\n", getpid(), argv[i]);
        }
    }
}

软链接和硬链接

  • 硬链接
    在这里插入图片描述

  • 删除链接和文件更名
    在这里插入图片描述

  • 软链接
    在这里插入图片描述

  • 命令行实现软连接和硬链接

    软链接:ln -s 源文件 目标文件
    硬链接:ln 源文件 目标文件
    

    硬链接相当于复制了一份源文件
    软链接相当于创建了一个快捷方式,当源文件被删除,软链接文件也失效
    在这里插入图片描述

  • 硬链接示例

    /***********************************************************
     * Description:创建硬链接
     ***********************************************************/
    void example3(int argc, char* argv[])
    {
        if (argc < 2) {
            fprintf(stderr, "usage: %s files\n", argv[0]);
            exit(-1);
        }
        for (int i = 2; i < argc; i++) {
            if (link(argv[1], argv[i]) < 0) {
                perror("link error!");
                continue;
            }
        }
        printf("create success!\n");
    }
    
  • 软链接示例

/***********************************************************
 * Description:创建软链接,并通过文件readlink读取文件本身内容
 ***********************************************************/
void example4(int argc, char* argv[])
{
    if (argc < 3) {
        fprintf(stderr, "usage: %s srcfile linkfiles\n", argv[0]);
        exit(-1);
    }

    if (symlink(argv[1], argv[2]) < 0) {
        perror("symlink error!\n");
    }

    char buffer[1024];
    ssize_t size;
    memset(buffer, 0, sizeof(buffer));
    int fd = open(argv[2], O_RDONLY);
    if (fd < 0) {
        perror("open error!\n");
        exit(-1);
    }
    //读取软链接文件引用的源文件内容
    if ((size = read(fd, buffer, sizeof(buffer))) < 0) {
        perror("read error!\n");

    } else {
        write(STDOUT_FILENO, buffer, size);
    }
    printf("\n");
    //读取软链接文件本身的内容
    memset(buffer, 0, sizeof(buffer));
    if ((size = readlink(argv[2], buffer, sizeof(buffer))) < 0) {
        perror("readlink error!");

    } else {
        write(STDOUT_FILENO, buffer, size);
    }
    printf("\n");
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值