《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文件其他用户的权限都消失了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【eNSP实验项目】eNSP实验配置项目教程,ensp安装步骤

eNSP安装教程 附安装包 eNSP介绍安装教程1.安装 VirtualBox2.安装 WinPcap3.安装 Wireshark4.eNSP安装 eNSP介绍 eNSP是华为提供的一款功能强大的网络仿真平台&#xff0c;适用于学习、实践和测试企业网络场景&#xff0c;可以帮助用户深入理解网络知识和技术。 eNSP安装,需要…

Tektronix泰克TCP303示波器电流探头

主要特点和优点&#xff1a; ● 交流/直流测量功能 ● DC~100MHz电流探头放大器&#xff08;TCPA300&#xff09;&#xff0c;当使用&#xff1a; - DC~100MHz, 30A DC&#xff08;TCP312&#xff09; - DC~50MHz, 50A DC&#xff08;TCP305&#xff09; - DC~5MHz, 150A DC&a…

关于多重背包的笔记

多重背包可以看作01背包的拓展&#xff0c; 01背包是选或者不选。多重背包是选0个一直到选s个。 for (int i 1; i < n; i) {for (int j m; j > w[i]; --j){f[j] max(f[j], f[j - 1*w[i]] 1*v[i], f[j - 2*w[i]] 2*v[i],...f[j - s*w[i]] s*v[i]);} } 由上述伪代码…

Mybatis-plus是使用,告别繁琐的CRUD编写,自动生成直接使用

目录 一、简介 1. 是什么 2. 特性 3. 框架结构 4. 常用注解 二、搭建使用 1. 依赖 2. 生成器 3. 生成 4. 引用 5. 路径访问 三、测试 四、雪花ID 每篇一获 Mybatis-plus&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;…

VRRP协议

一.基本概念 1.概念 VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器的IP地址为默认网关&#xff0c;实现网关的备份。协议版本&#xff1a;VRRPv2&#xff08;常用&#xff09;和VRRPv3&#xff1a;VRRPv2仅适用于…

【基于卷积神经网络的疲劳检测与预警系统的设计与实现】

基于卷积神经网络的疲劳检测与预警系统的设计与实现 引言数据集介绍技术与工具1. OpenCV2. TensorFlow3. 卷积神经网络&#xff08;CNN&#xff09; 系统功能模块1. 视频采集模块2. 图像预处理模块3. 人脸识别模块4. 疲劳程度判别模块5. 报警模块 系统设计创新点1. 实时监测与预…

【LeetCode刷题笔记(6-1)】【Python】【三数之和】【哈希表】【中等】

文章目录 引言三数之和题目描述示例示例1示例2示例3 提示 解决方案1&#xff1a;【三层遍历查找】解决方案2&#xff1a;【哈希表】【两层遍历】结束语 三数之和 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的…

【STM32】STM32学习笔记-EXTI外部中断(11)

00. 目录 文章目录 00. 目录01. 中断系统02. 中断执行流程03. STM32中断04. NVIC基本结构05. NVIC优先级分组06. EXTI简介07. EXTI基本结构08. AFIO复用IO口09. EXTI框图10. 计数器模块11. 旋转编码器简介12. 附录 01. 中断系统 中断&#xff1a;在主程序运行过程中&#xff0…

韩顺平学java第二阶段之BS框架002

这边讲了php都可以&#xff0c;反正就是打通双方的间隔就行了∑(っД;)っ卧槽&#xff0c;不见了

t-SNE高维数据可视化实例

t-SNE&#xff1a;高维数据分布可视化 实例1&#xff1a;自动生成一个S形状的三维曲线 实例1结果&#xff1a; 实例1完整代码&#xff1a; import matplotlib.pyplot as plt from sklearn import manifold, datasets """对S型曲线数据的降维和可视化"&q…

Web攻防07_文件上传基础_文件上传靶场upload-labs-docker

文章目录 项目安装安装docker进入项目目录&#xff1a;一键部署运行 靶场关卡1、前端JS验证如何判断是否为前端验证解法1&#xff1a;抓包解法2&#xff1a;禁用JS 2、.htaccess解法 3、MIME类型解法 4、文件头判断5、黑名单过滤-过滤不严-单次过滤为空格6、黑名单-过滤不严-系…

Python生成器(Generator)(继续更新...)

学习网页&#xff1a; Welcome to Python.orghttps://www.python.org/https://www.python.org/ Python生成器 生成器&#xff08;Generator&#xff09;是 Python 的一种特殊类型的迭代器。生成器允许你创建自己的数据流&#xff0c;每次从数据流中获取一个元素&#xff0c;…

活动 | Mint Blockchain 将于 2024 年 1 月 10 号启动 MintPass 限时铸造活动

MintPass 是由 Mint Blockchain 官方发行的 Mint 网络和社区的 NFT 通行证&#xff0c;将在 2024 年 1 月份启动限时铸造活动。今天这篇文章会着重向大家介绍即将举办的 MintPass 活动的基础信息。 MintPass 有 2 种类型&#xff1a; 类型 1&#xff1a;Mint Genesis NFT Mint…

Unity中Shader URP 简介

文章目录 前言一、URP&#xff08;Universal Render Pipeline&#xff09;由名字可知&#xff0c;这是一个 通用的 渲染管线1、Universal&#xff08;通用性&#xff09;2、URP的由来 二、Build-in Render Pipeline&#xff08;内置渲染管线&#xff09;1、LWRP&#xff08;Lig…

【JavaEE】多线程案例 - 定时器

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

C语言:求和1+1/2-1/3+1/4-1/5+……-1/99+1/100

#include<stdio.h> int main() {int i 0;double sum 0.0;int flag 1;for (i 1;i < 100;i){sum 1.0 / i * flag;flag -flag;}printf("sum%lf\n", sum);return 0; }

设计模式——策略模式

引言 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 问题 一天&#xff0c; 你打算为游客们创建一款导游程序。 该程序的核心功能是提供美观的地图&#xff0c; 以…

【每日一题】使用最小花费爬楼梯

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划空间优化 写在最后 Tag 【动态规划空间优化】【数组】【2023-12-17】 题目来源 746. 使用最小花费爬楼梯 解题思路 方法一&#xff1a;动态规划 思路 假设数组 cost 的长度为 n&#xff0c;则 n 阶楼梯分别对应下标…

Python往事:ElementTree的单引号之谜

最近在针对某款设备的界面xml进行更新过程中&#xff0c;被告知回稿的字串放在了一个excel文件中&#xff0c;而我要上传到服务器的界面用语是用xml文件封装的。再经过详细求证了翻译组提供excel文件的原因后&#xff0c;我决定用python来完成界面用语xml的更新&#xff0c;但是…

OOD 异常GPT:使用大型视觉语言模型检测工业异常

paper link https://arxiv.org/abs/2308.15366video demo https://youtu.be/lcxBfy0YnNAgithub https://github.com/CASIA-IVA-Lab/AnomalyGPT在线使用 https://huggingface.co/spaces/FantasticGNU/AnomalyGPT 摘要 大型视觉语言模型&#xff08;LVLM&#xff09;如MiniGPT-4…