当前位置: 首页 > news >正文

《Linux C编程实战》笔记:文件属性操作函数

获取文件属性

stat函数

在shell下直接使用ls就可以获得文件属性,但是在程序里应该怎么获得呢?

#include<sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *file_name,struct stat *buf);
int fstat(int filedes,struct stat *buf);
int lstat(const char *file_name,struct stat *buf);
  1. stat 函数:

    int stat(const char *file_name, struct stat *buf);

    • stat 函数用于获取由 file_name 指定的文件的信息,并将其存储在由 buf 指向的结构体中。
    • 信息包括文件大小、inode号、所有者和组ID、权限、时间戳等。
  2. fstat 函数:

    int fstat(int filedes, struct stat *buf);

    • fstat 函数类似于 stat,但它不是通过文件名而是通过已打开文件的文件描述符 filedes 来获取文件信息。
    • 它将文件描述符关联的文件的信息存储在由 buf 指向的结构体中。
    • 这在你已经有一个文件描述符的情况下很有用,可以直接获取已打开文件的信息。
  3. lstat 函数:

    int lstat(const char *file_name, struct stat *buf);

    • lstat 函数类似于 stat,但它不会跟随符号链接。
    • 如果指定的文件是符号链接,lstat 提供有关链接本身的信息,而 stat 则会跟随链接并提供有关链接的文件的信息。
    • 在你想要获取符号链接本身而不是链接指向的文件的信息时,这是很有用的。

函数失败返回-1 。

struct stat {dev_t         st_dev;      // 文件所在设备的IDino_t         st_ino;      // 文件的inode号mode_t        st_mode;     // 文件的类型和权限nlink_t       st_nlink;    // 文件的硬链接数uid_t         st_uid;      // 文件所有者的用户IDgid_t         st_gid;      // 文件所有者的组IDdev_t         st_rdev;     // 若文件是设备文件,则为设备的IDoff_t         st_size;     // 文件的大小(以字节为单位)blksize_t     st_blksize;  // 文件系统块大小blkcnt_t      st_blocks;   // 文件占用的块数time_t        st_atime;    // 最后一次访问时间time_t        st_mtime;    // 最后一次修改时间time_t        st_ctime;    // 最后一次状态改变时间
};

以下是一些常见的 st_mode 宏:

  1. 文件类型宏:

    • S_ISREG(mode): 判断是否为常规文件。
    • S_ISDIR(mode): 判断是否为目录。
    • S_ISCHR(mode): 判断是否为字符设备。
    • S_ISBLK(mode): 判断是否为块设备。
    • S_ISFIFO(mode): 判断是否为FIFO(先进先出)。
    • S_ISLNK(mode): 判断是否为符号链接。
    • S_ISSOCK(mode): 判断是否为套接字。
  2. 文件权限宏:

    • S_IRUSR, S_IWUSR, S_IXUSR: 用户(所有者)的读、写、执行权限。
    • S_IRGRP, S_IWGRP, S_IXGRP: 组的读、写、执行权限。
    • S_IROTH, S_IWOTH, S_IXOTH: 其他用户的读、写、执行权限。

示例程序1

以本代码的cpp文件为例,演示获取文件属性。注意文件名同步成自己的文件名

#include<iostream>
#include<cstring>
#include <cstdio>
#include<ctime>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<cerrno>
using namespace std;
int main(){struct stat buf;if(stat("test.cpp",&buf)==-1){perror("stat:");exit(1);}//printprintf("device is %d\n",buf.st_dev);printf("inode is :%d\n",buf.st_ino);printf("mode id:%o\n",buf.st_mode);printf("number of hard links is:%d\n",buf.st_nlink);printf("user ID of owner is:%d\n",buf.st_uid);printf("group ID of owner is :%d\n",buf.st_gid);printf("device type(if inode device) is :%d\n",buf.st_rdev);printf("total size,in bytes is:%d\n",buf.st_size);printf("blocksize for filesystem I/O is:%d\n",buf.st_blksize);printf("number of blocks allocated is :%d\n",buf.st_blocks);printf("time of last access is :%s",ctime(&buf.st_atime));printf("time of last modification is :%s",ctime(&buf.st_mtime));printf("time of last change is :%s",ctime(&buf.st_ctime));return 0;
}

代码本身不难懂;st_mode用八进制格式输出;ctime函数可以把时间值(表示自纪元以来的秒数)转换为人类可读的ASCII字符串形式。

修改文件设置

chmod函数

修改文件的存取权限

#include <sys/types.h>
#include<sys/stat.h>
int chmod(const char *path,mode_t mode);
int fchmod(int fildes,mode_t mode);

mode 参数指定新的权限。mode 的取值是一个八进制数字,由不同的位掩码组成。以下是一些常见的 mode 取值:

  1. 权限位掩码(三个八进制数字):

    • User (Owner) Permissions:

      • S_IRUSR (读权限): 00400
      • S_IWUSR (写权限): 00200
      • S_IXUSR (执行权限): 00100
    • Group Permissions:

      • S_IRGRP (读权限): 00040
      • S_IWGRP (写权限): 00020
      • S_IXGRP (执行权限): 00010
    • Others Permissions:

      • S_IROTH (读权限): 00004
      • S_IWOTH (写权限): 00002
      • S_IXOTH (执行权限): 00001
  2. 特殊权限位掩码:

    • S_ISUID (Set User ID): 04000
    • S_ISGID (Set Group ID): 02000
    • S_ISVTX (Sticky Bit): 01000

这些位掩码可以通过按位或操作组合在一起,形成完整的 mode 参数。

修改文件的用户id和组id

#include <unistd.h>
int chown(const char *path, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
  • path: 文件或目录的路径名。
  • owner: 新的所有者的用户ID。
  • group: 新的组的ID。

成功返回0,失败返回-1 。

chown系统调用会清除(S_ISUID和S_ISGID)

truncate函数

用于改变文件大小

#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path,off_t length);
int ftruncate(int fd, off_t length);

将指定文件大小改为length指定的大小。如果原来文件大小比参数大,超过部分会被删除;如果比参数小,文件将被拓展,和lseek类似,拓展部分将以'\0'填充。吐过文件大小被改变了,则文件 的st_mtime和st_ctime将会更新(忘了?回去看stat结构体)

执行成功返回0,发生错误返回-1 。

utime函数

用于改变文件的st_mtime和st_ctime域。

#include <sys/types.h>
#include <utime.h>
int utime (const char *filename,struct utimbuf *buf);
#include <sys/time.h>
int utimes (char *filename,struct timeval *tvp);
struct utimbuf{
time_t actime:/*access time*/
time_t modtime; /*modification time */
};

struct timeval 是表示时间的结构体,在C语言中通常用于处理微秒级别的时间。它的定义如下:

struct timeval { time_t tv_sec; // 秒数

suseconds_t tv_usec; // 微秒数

};

utime 系统调用会把由第一个参数filename指定的文件的存取时间改为第二个参数 buf 的actime域,把修改时间改为第二个参数buf 的modtime域,如果buf是一个空指针,则将存取时间和修改时间都改为当前时间。

用法如下:

 const char *filename = "example.txt";struct utimbuf new_times;new_times.actime = 1632976800;  // Example access time (in seconds since the epoch)new_times.modtime = 1632976900;  // Example modification time (in seconds since the epoch)if (utime(filename, &new_times) == -1) {perror("utime");return 1;}

另一个函数用法如下:

 const char *filename = "example.txt";struct timeval new_times[2];new_times[0].tv_sec = 1632976800;  // Example access time (in seconds since the epoch)new_times[1].tv_sec = 1632976900;  // Example modification time (in seconds since the epoch)if (utimes(filename, new_times) == -1) {perror("utimes");return 1;}

umask函数

#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);

用于设置文件创建时的屏蔽字,并返回以前的值。

在创建一个新文件或目录时,新文件的实际存取权限时如open函数里mode与umask按照

(mode&~umask)的结果,可以理解为mode再去除掉umask。

示例程序2

演示umask函数的运用

#include<iostream>
#include<cstring>
#include <cstdio>
#include<ctime>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<cerrno>
using namespace std;
int main(){umask(0);//不屏蔽任何权限if(creat("example_681.test",S_IRWXU|S_IRWXG|S_IRWXO)<0){perror("creat");exit(1);}umask(S_IRWXO);//屏蔽 其他用户的所有权限if(creat("example_682.test",S_IRWXU|S_IRWXG|S_IRWXO)<0){perror("creat");exit(1);}return 0;
}

创建第一个文件时,不屏蔽任何权限;

创建第二个文件时,umask设置了S_IRWXO,那么S_IRWXU|S_IRWXG|S_IRWXO的组合就要去掉S_IRWXO这个权限了。

可以看到682文件其他用户的权限都消失了。

相关文章:

《Linux C编程实战》笔记:文件属性操作函数

获取文件属性 stat函数 在shell下直接使用ls就可以获得文件属性&#xff0c;但是在程序里应该怎么获得呢&#xff1f; #include<sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *file_name,struct stat *buf); int fstat(i…...

linux中的网络知识

网络 认识基本网络网络划分计算机网络分为LAN、MAN、WAN公网ip和私网ip 传输介质单位换算客户端和服务端 OSI模型osi七层模型TCP/IP:传输控制协议簇HTTP协议简介UDP协议介绍物理地址&#xff1a;mac地址&#xff0c;全球唯一&#xff0c;mac由6段16进制数组成&#xff0c;每段有…...

tp中的调试模式

ThinkPHP有专门为开发过程而设置的调试模式&#xff0c;开启调试模式后&#xff0c;会牺牲一定的执行效率&#xff0c;但带来的方便和除错功能非常值得。 我们强烈建议ThinkPHP开发人员在开发阶段始终开启调试模式&#xff08;直到正式部署后关闭调试模式&#xff09;&#xf…...

【docker 】基于Dockerfile创建镜像

Dockerfile文档 Dockerfile文档地址 Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。 DockerFile 可以说是一种可以被 Docker 程序解释的脚本&#xff0c;DockerFile 是由一条条的命令组成的&#xff0c;每条命令对应 …...

C# 提取PDF中指定文本、图片的坐标

获取PDF文件中文字或图片的坐标可以实现精确定位&#xff0c;这对于快速提取指定区域的元素&#xff0c;以及在PDF中添加注释、标记或自动盖章等操作非常有用。本文将详解如何使用国产PDF库通过C# 提取PDF中指定文本或图片的坐标位置&#xff08;X, Y轴&#xff09;。 ✍ 用于…...

CTF网络安全大赛是干什么的?发展史、赛制、赛程介绍,参赛需要学什么?

CTF&#xff08;Capture The Flag&#xff09;是一种网络安全竞赛&#xff0c;它模拟了各种信息安全场景&#xff0c;旨在提升参与者的网络安全技能。CTF 赛事通常包含多种类型的挑战&#xff0c;如密码学、逆向工程、网络攻防、Web 安全、二进制利用等。 发展史 CTF 的概念…...

阿里云SMC迁移RedHat/CentOS 5 内核升级

阿里云SMC迁移RedHat/CentOS 5 内核升级 1. 起因 服务器需要迁移上阿里云,有几台服务器用的是Redhat 5.x,在使用SMC进行迁移时出现以下报错. [2023-12-13 09:50:55] [Error] Check System Info Failed, codeS16_111, msgGet OS Info Failed: [error] grub is too old for C…...

无代码开发让合利宝支付与CRM无缝API集成,提升电商用户运营效率

合利宝支付API的高效集成 在当今快速发展的电子商务领域&#xff0c;电商平台正寻求通过高效的支付系统集成来提升用户体验和业务处理效率。合利宝支付&#xff0c;作为中国领先的支付解决方案提供者&#xff0c;为电商平台提供了一个高效的API连接方案。这种方案允许无代码开…...

数据标注公司如何确保数据安全?景联文科技多维度提供保障

数据标注公司通常拥有大量的AI数据和用户数据&#xff0c;保护数据安全是数据标注公司的重要任务。 数据标注公司确保标注数据的安全可以从制度、人员、工具等多个方面入手&#xff0c;建立完善的安全管理体系和审计机制&#xff0c;加强应急预案和备份机制的建立&#xff0c;以…...

(C语言)精确计算程序运行时间的方法

一、先计算每秒多少个计数 typedef __int64 s64;s64 tps; /* timestamp counter per second */s64 get_tps(void) {s64 t0 rdtsc();Sleep(100);return (rdtsc() - t0) * 10; } 这段代码定义了一个函数 get_tps&#xff0c;该函数用于测量处理器的时间戳计数器&#xff08;RD…...

【Vulnhub 靶场】【VulnCMS: 1】【简单】【20210613】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/vulncms-1,710/ 靶场下载&#xff1a;https://download.vulnhub.com/vulncms/VulnCMS.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年06月13日 文件大小&#xff1a;1.4 GB 靶场作者&#xff1a;to…...

普冉(PUYA)单片机开发笔记(10): I2C通信-配置从机

概述 I2C 常用在某些型号的传感器和 MCU 的连接&#xff0c;速率要求不高&#xff0c;距离很短&#xff0c;使用简便。 I2C的通信基础知识请参见《基础通信协议之 IIC详细讲解 - 知乎》。 PY32F003 可以复用出一个 I2C 接口&#xff08;PA3&#xff1a;SCL&#xff0c;PA2&a…...

Idea maven打包时 报错 illegalArgumentException: Malformed \uxxxx encoding 解决方法

1 改变打包命令重新打包 在maven打包命令上加入 -e -X 2 找到报错类和方法 可以看到是 java.util.Properties#loadConvert类方法中有个throw new IllegalArgumentException( "Malformed \\uxxxx encoding.")&#xff0c;在此打断点 3 以Debug方式重新运行maven…...

Qt中槽函数在那个线程执行的探索和思考

信号和槽是Qt的核心机制之一&#xff0c;通过该机制大大简化了开发者的开发难度。信号和槽属于观察者模式&#xff08;本质上是回调函数的应用&#xff09;。是函数就需要考虑其是在那个线程中执行&#xff0c;本文讨论的就是槽函数在那个线程中执行的问题。 目录 1. connect…...

C++ 类模板

目录 前言 类模板语法 类模板和函数模板的区别 类模板没有自动类型推导的使用方式 类模板在模板参数列表中可以有默认参数 类模板中成员函数创建时机 类模板对象做函数参数 指定传入的类型 参数模板化 整个类模板化 类模板与继承 类模板成员函数类外实现 类模板分…...

边缘计算系统设计与实践

随着科技的飞速发展&#xff0c;物联网和人工智能两大领域的不断突破&#xff0c;我们看到了一种新型的计算模型——边缘计算的崛起。这种计算模型在处理大规模数据、实现实时响应和降低延迟需求方面&#xff0c;展现出了巨大的潜力。本文将深入探讨边缘计算系统的设计原理和实…...

【Spark精讲】Spark存储原理

目录 类比HDFS的存储架构 Spark的存储架构 存储级别 RDD的持久化机制 RDD缓存的过程 Block淘汰和落盘 类比HDFS的存储架构 HDFS集群有两类节点以管理节点-工作节点模式运行&#xff0c;即一个NameNode(管理节点)和多个DataNode(工作节点)。 Namenode管理文件系统的命名空…...

贪心算法:买卖股票的最佳时机II 跳跃游戏 跳跃游戏II

122.买卖股票的最佳时机II 思路&#xff1a; 想要获得利润&#xff0c;至少要以两天为一个交易单元&#xff0c;因为两天才会有股价差。因此可以将最终利润进行分解&#xff0c;如prices[3] - prices[0] (prices[3] - prices[2]) (prices[2] - prices[1]) (prices[1] - pr…...

音频DAC,ADC,CODEC的选型分析,高性能立体声

想要让模拟信号和数字信号顺利“交往”&#xff0c;就需要一座像“鹊桥”一样的中介&#xff0c;将两种不同的语言转变成统一的语言&#xff0c;消除无语言障碍。这座鹊桥就是转换器芯片&#xff0c;也就是ADC芯片。ADC芯片的全称是Analog-to-Digital Converter, 即模拟数字转换…...

python 连接SQL server 请用pymssql连接,千万别用pyodbc

pymssql官方介绍文档 python 使用 pymssql连接 SQL server 代码示例&#xff1a; 安装pymssql包&#xff1a; pip install pymssql代码&#xff1a; import pymssqldef conn_sqlserver_demo():# 连接字符串示例&#xff08;根据您的配置进行修改&#xff09;conn Nonetry:co…...

IntelliJ IDEA 自带HTTP Client接口插件上传文件示例

如何使用IntelliJ IDEA自带的HTTP Client接口插件进行文件上传的示例。在这个示例中&#xff0c;我们将关注Controller代码、HTTP请求文件&#xff08;xxx.http&#xff09;&#xff0c;以及文件的上传和处理。 Controller代码 首先&#xff0c;让我们看一下处理文件上传的Co…...

C++中的接口有什么用

2023年12月13日&#xff0c;周三上午 今天上午在适配器模式&#xff0c;我发现如果想真正理解适配器模式&#xff0c;就必须学会使用C中的接口&#xff0c;就必须明白为什么要在C中使用接口&#xff0c;所以重新学习了一下C中的接口 目录 C中的接口有什么用用代码说明“实现多…...

el-table合并相同数据的单元格

相同的数据合并单元格 <el-table :data"userList" :span-method"objectSpanMethod" border><el-table-column type"selection" width"50" align"center" /><el-table-column label"用户名称" a…...

Verilog Systemverilog define宏定义

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 文章前情预告一、define是个啥&#xff1f;二、为什么要使用define三、怎么使用define四、define的横向拓展五、define思想在生活中的体现!六、结论七、参考资料八、…...

51单片机应用从零开始(十一)·数组函数、指针函数

51单片机应用从零开始&#xff08;九&#xff09;数组-CSDN博客 51单片机应用从零开始&#xff08;十&#xff09;指针-CSDN博客 目录 1. 用数组作函数参数控制流水花样 2. 用指针作函数参数控制 P0 口 8 位 LED 流水点亮 1. 用数组作函数参数控制流水花样 要在51单片机中…...

【PostgreSQL】从零开始:(八)PostgreSQL-数据库PSQL元命令

元命令 postgres# \? General\bind [PARAM]... set query parameters\copyright show PostgreSQL usage and distribution terms\crosstabview [COLUMNS] execute query and display result in crosstab\errverbose show most recent error…...

02 使用Vite创建Vue3项目

概述 A Vue project is structured similarly to a lot of modern node-based apps and contains the following: A package.json fileA node_modules folder in the root of your projectVarious other configuration files are usually contained at the root level, such …...

Shell三剑客:sed(简介)

一、前言 Stream EDitor:流编辑 sed 是一种在线的、非交互式的编辑器&#xff0c;它一次处理一行内容。处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”(pattern space)&#xff0c;接着用sed命令处理缓冲区中的内容&#xff0c;处理完成后&…...

tp连接数据库

ThinkPHP内置了抽象数据库访问层&#xff0c;把不同的数据库操作封装起来&#xff0c;我们只需要使用公共的Db类进行操作&#xff0c;而无需针对不同的数据库写不同的代码和底层实现&#xff0c;Db类会自动调用相应的数据库驱动来处理。采用PDO方式&#xff0c;目前包含了Mysql…...

jmeter,断言:响应断言、Json断言

一、响应断言 接口A请求正常返回值如下&#xff1a; {"status": 10013, "message": "user sign timeout"} 在该接口下创建【响应断言】元件&#xff0c;配置如下&#xff1a; 若断言成功&#xff0c;则查看结果树的接口显示绿色&#xff0c;若…...

怎么用vs做网站开发/免费的推广平台

本篇文章帮大家学习ant删除任务&#xff0c;包含了Ant删除任务使用方法、操作技巧、实例演示和注意事项&#xff0c;有一定的学习价值&#xff0c;大家可以用来参考。此任务用于删除单个文件&#xff0c;目录或子目录。 还可以通过指定文件集来删除文件集。 默认情况下它不会删…...

wordpress wrapper/推广赚佣金的平台

图像算法中会经常用到摄像机的畸变校正&#xff0c;有必要总结分析OpenCV中畸变校正方法&#xff0c;其中包括普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法。 普通相机模型畸变校正函数针对OpenCV中的cv::initUndistortRectifyMap()&#xff0c;鱼眼相机模型畸变校正…...

2022年网页游戏排行榜/网站seo优化网站

线程和进程的操作是由程序触发系统接口&#xff0c;最后的执行者是系统&#xff1b;协程的操作则是程序员。协程存在的意义&#xff1a;对于多线程应用&#xff0c;CPU通过切片的方式来切换线程间的执行&#xff0c;线程切换时需要耗时(保存状态&#xff0c;下次继续)。协程&am…...

阜宁网站制作收费标准/排行榜123网

python实现删除列表中某个元素的3种方法 python中关于删除list中的某个元素&#xff0c;一般有三种方法:remove、pop、del&#xff1a; 1.remove: 删除单个元素&#xff0c;删除首个符合条件的元素&#xff0c;按值删除 举例说明: >>> str[1,2,3,4,5,2,6] >>>…...

棋牌源码交易商城/西安seo排名公司

设置HSSFCellStyle的前景色总是黑色的我正在使用POI来创build一个Java电子表格。 我有以下用于创build标题行的代码&#xff1a;HSSFWorkbook wb new HSSFWorkbook(); HSSFSheet sheet wb.createSheet("Report"); // some more code HSSFRow row sheet.createRow(…...

网站模版怎样使用/抖音seo优化排名

原文:SQL Server &#xff1a;理解DCM页我们已经讨论了各种不同的页&#xff0c;包括数据页、GAM与SGAM页、PFS页&#xff0c;还有IAM页。今天我们来看下差异变更页&#xff08;Differential Change Map&#xff1a;DCM &#xff09;&#xff0c;还有差异备份&#xff08;diffe…...