APUE 2 文件和目录

STM32+MPU6050滤波算法实战:从原始数据到稳定姿态 数字滤波是嵌入式传感器应用中最基础也最关键的信号处理环节。传感器输出的原始数据往往混杂着高频噪声、零偏漂移和随机扰动,直接用于姿态解算或控制系统会导致波形毛刺严重甚至发散。针对此类问题,工程上通常采用滑动窗口滤波、一阶低通滤波等简单算法平滑数据,再引入互补滤波或卡尔曼滤波完成多传感器融合,兼顾短期精度与长期稳定性。这些方法广泛适应于平衡车、四轴飞行器、机械臂控制等动态测控场景。互补滤波以低计算开销实现加速度计与陀螺仪的优势互补,卡尔曼滤波则在高动态环境下提供更优估计性能。文章基于STM32与MPU6050这 阅读详情

本文代码实现采用golang的syscall包,其通常会包装一层系统调用不过大体相似


1.文件属性结构 Stat_t

文件的类型

文件类型描述
普通文件可能是文本或二进制
目录文件包含该目录内的文件名,和有关这些文件信息的指针
块特殊文件提供对设备带缓冲的访问
字特殊文件提供对设备不带缓冲的访问,每次访问长度可变
FIFO命名管道,用于进程间通信
套接字用于进程间的网络通信,也可用于同一台宿主机进程间非网络通信
符号链接指向另一个文件

描述文件属性的结构体Stat_t

type Stat_t struct {
        Dev       uint64  //设备号,文件(以及i节点)在此文件系统中
        Ino       uint64 //inode号
        Nlink     uint64 //链接数
        Mode      uint32 //文件类型&访问权限
        Uid       uint32 //属主ID
        Gid       uint32 //属组ID
        X__pad0   int32
        Rdev      uint64 //实际设备号,只有块字特殊文件才有此值
        Size      int64 //文件大小,byte单位
        Blksize   int64 //最佳I/O块大小
        Blocks    int64 //已分配块数(512字节块或其他,根据不同系统可能不同)
        Atim      Timespec //访问时间
        Mtim      Timespec //修改内容时间
        Ctim      Timespec //修改文件属性时间
        X__unused [3]int64
}

type Timespec struct {
        Sec  int64 //秒
        Nsec int64 //纳秒
}

2.查看文件属性信息stat、fstat、lstat

func Stat(path string, stat *Stat_t) (err error)
func Fstat(fd int, stat *Stat_t) (err error)
func Lstat(path string, stat *Stat_t) (err error)

Stat函数根据传入的path,读取文件属性写至stat,注意Stat函数会追踪符号链接至真实文件
Fstat函数根据当前已打开的文件描述符,读取属性至stat
Lstat函数同Stat,但不会追踪链接文件,直接返回符号链接的属性

3.进程相关的ID

4.4

  • 实际ID:通常为登录会话时取自口令文件中的登陆项,超级用户进程有方法改变。表示当前的会话(如SHELL)属于哪个ID
  • 有效ID:用于文件访问权限的检测
  • 保存的设置ID:有效ID的副本 exec函数使用
  • 文件所有ID:文件Stat_t中的Uid Gid

通常情况下,启动一个进程时会将有效ID设置为实际ID
但是在文件Mode属性中存在特殊的位设置用户和设置组,如若设置了该位置,启动一个进程时有效ID会被设置为文件所有ID

4.文件访问权限

所有类型的文件均具有访问权限设置,其值在Stat_t中的Mode
4.5
对于不同类型的文件,再此处做2类区分,文件和目录:

  • 文件
    • 对于文件进行有关的open write read操作时,根据具体的操作类型判断对应的访问权限(读 写)是否有效
    • 当文件为可执行文件时,若需要执行则执行位要有效
  • 目录
    • 目录的读权限,允许读某目录中的所有文件名列表
    • 目录的写权限,允许对某目录项的内容进行修改,如增减文件
    • 目录的执行权限,决定是否可以对该目录进行搜索操作,如想打开、执行。增加删除某一文件,则其所有父层级的目录均需要拥有执行权限。执行权限确定了是否允许找到这个文件(如CD到某一目录,需要拥有该目录的执行权限)

5.创建新文件和目录的所有权

新文件的用户ID设置为当前进程有效用户ID
组ID取决于其所属的目录的设置组ID是否有效,若有效则新创建的文件的组ID为该目录的组ID;否则为进程的有效组ID

6.访问权限测试 access和faccessat

func Access(path string, mode uint32) (err error)
func Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
//R_OK=4, W_OK=2, X_OK=1, F_OK=0   mode只可以为对应的整数值

注意:golang中的Access参数mode不可用C中的测试宏(R_OK等),等效可用对应的整数值。如上边的注释内容

如果想自行进行访问权限的检测,如通过实际ID来进行检测等
Access与Faccessat区别:

  • Faccessat的dirfd可以指定某目录fd,当fd=_AT_FDCWD时二者访问路径相同
  • flags=AT_EACCESS 通过进程有效ID检测,默认是使用实际ID检测

7.屏蔽字umask

func Umask(mask int) (oldmask int)

4-7

当创建文件时,将和umask进行与非操作(类似网络掩码),使创建的文件不含有某些权限

注意:修改进程的umask不会影响其父进程(通常为shell)

8.修改文件模式属性 Chmod、Fchmod、Fchmodat

func Chmod(path string, mode uint32) (err error)
func Fchmod(fd int, mode uint32) (err error)
func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)

3个函数区别:

  • Fchmod可指定已打开的文件
  • Fchmodeat可指定文件夹描述符
    • 参数flags可指定AT_SYMLINK_NOFOLLOW以不追踪符号链接
    • 参数dirfd可指定为AT_FDCWD以使用相对路径

mode 常量
VTX

粘着位 S_ISVTX:

  • 设置文件:会保存程序正文副本保存至交换分区(目前流行操作系统无需此操作,意义不大)
  • 设置目录:只有满足下列要求的用户才可删除该目录下的文件
    • 拥有待删除文件
    • 拥有该目录
    • 是超级用户

9.修改文件属主(组) chown系列

func Chown(path string, uid int, gid int) (err error)
func Fchown(fd int, uid int, gid int) (err error)
func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
func Lchown(path string, uid int, gid int) (err error)

这四个函数与其他类似函数的变种概念相近
除了Fchown(根据打开的文件)其他的均可由Fchownat来包装形成
影响Fchownat行为的参数:

  • AT_SYMLINK_NOFOLLOW 不追踪符号链接
  • AT_FDCWD 相对路径

10.文件长度

文件属性中的Size描述了文件的长度

  • 针对普通文件通常是一个数(16或512)的整数倍
  • 针对符号链接,长度是在文件名的实际字符数

文件属性中的Blocks描述了文件所占512字节块(或其他)数目
关于产生文件空洞的现象(Size>>Blocks*N),空洞未分配实际磁盘空间,但使用Read函数会把空洞位读出0,既会读出Size个字符

11.文件截断

func Truncate(path string, length int64) (err error)
func Ftruncate(fd int, length int64) (err error)

根据指定的length将目标文件进行截断,使文件长度变成length,若原长度小于length的话将产生空洞

12.文件系统*

以Berkeley快速文件系统为例
123

磁盘可划分为多个分区,每个分区包含一个文件系统。本章值得注意的是i节点和数据块(含目录块)
i节点包含文件stat结构中的大多数信息
目录块含目录中各文件名和对应的i节点地址
i节点

当创建一个新目录testdir后文件系统内相关结构
结构

func Link(oldpath string, newpath string) (err error)
func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error)
func Unlink(path string) error
func Unlinkat(dirfd int, path string, flags int) (err error)

如上文文件系统的描述,任何一个文件可以有多个目录项指向其i节点

创建硬链接(目录项)

  • Link和Linkat,会使文件属性的Nlink+1
  • linkat可以指定目录的文件描述符
  • flags可设置AT_SYMLINK_NOFOLLOW或AT_SYMLINK_FOLLOW来指定是否跟随符号链接

删除硬链接

  • Unlink和Unlinkat,会使文件属性的Nlink-1,当Nlink减少至0时,该文件可以被删除
    • 该操作需要有包含该目录项的目录具有写和执行权限,注意粘着位
    • 当关闭一个文件时内核会检查当前同时打开该文件的进程数,若为0再检查Nlink若也为0则删除该文件的内容
  • Unlinkat可以指定目录的文件描述符
  • Unlinkat的flags可以指定为AT_REMOVEDIR,以支持删除目录
  • 不会跟随符号链接

14 重命名 rename和renameat

func Rename(oldpath string, newpath string) (err error)
func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)

针对待重命名文件的类型(文件或目录)有如下几种情况

  • 当oldpath为文件时且newpath存在时,删除newpath的目录项然后将oldpath重命名为newpath
    • 对其所包含的目录进程需要有写和执行权限
  • 当oldpath为目录时且newpath存在,则需要newpath为空目录,删除newpath再将oldpath重命名
    • newpath不能包含oldpath作为前缀

15 符号链接

一种特殊的文件类型,是类似于文件硬链接的文件间接指针,与硬链接不同:

  • 符号链接可以跨文件系统,而硬链接通常要求文件位于同一文件系统中
  • 任何用户都可以创建符号链接,而硬链接只可以是root操作

不同的系统调用对于符号链接是否跟随情况不一,如图
跟随情况

创建符号链接

func Symlink(oldpath string, newpath string) (err error)
func Symlinkat(oldpath string, newdirfd int, newpath string) (err error)

创建oldpath指向newpath的符号链接,Symlinkat的newdirfd为AT_FDCWD时两个函数相同

因为open函数会跟随符号链接,所以读取符号链接的内容存在独立的函数

func Readlink(path string, buf []byte) (n int, err error)
func Readlinkat(dirfd int, path string, buf []byte) (n int, err error)

函数会将符号链接的内容读入buf中,值为oldpath的路径名(不以null结尾)

16 文件的时间

Atim      Timespec //访问时间
Mtim      Timespec //修改内容时间
Ctim      Timespec //修改文件属性时间

type Timespec struct {
        Sec  int64 //秒
        Nsec int64 //纳秒
}

正如前文描述的文件属性

  • Atim为最近一次读取文件正文操作的时间
  • Mtim为最近一次修改文件正文操作的时间
  • Ctim为最近一次修改文件属性的时间
    • 修改文件属性就是修改关联i节点的值
    • 系统并不维护i节点最后访问的时间,所以access stat这些函数不会影响这三种时间

各种函数对文件时间的影响:
对时间影响

修改文件时间:

func Futimes(fd int, tv []Timeval) (err error) //打开的描述符
func Futimesat(dirfd int, path string, tv []Timeval) error //可指定目录描述符和path
func Utimes(path string, tv []Timeval) error //相对路径AT_FDCWD或绝对路径

type Timeval struct {
    Sec  int64
    Usec int64
}

17 创建目录


func Mkdir(path string, mode uint32) (err error)
func Mkdirat(dirfd int, path string, mode uint32) (err error)
func Rmdir(path string) error

注意创建目录时umask的影响,和是否支持设置组
Rmdir实际由Unlinkat实现:

func Rmdir(path string) error {
    return Unlinkat(AT_FDCWD, path, AT_REMOVEDIR)
}

18 更改(获取)当前工作目录 chdir fchdir getcwd

func Chdir(path string) (err error)
func Fchdir(fd int) (err error)
func Getcwd(buf []byte) (n int, err error)

19.文件访问权限小结

这里写图片描述

文件和目录之stat族函数<stat | fstat | lstat | fstatat>——APUE学习笔记(2) 一. 函数原型及具体数据结构:#include <sys/stat.h>int stat(const char *retrict pathname, struct stat *restrict buf); int fstat(int fd, struct stat *buf); int lstat(const char *restrict pathname, struct stat *restric 阅读详情

相关推荐

linux下《UNIX环境高级编程》(apue2)源码编译出错的处理方法

linux下《UNIX环境高级编程》(apue2)源码编译出错的处理方法

积小成大 503

golang 读取文件访问&创建&修改时间

编译报错信息: stat_t.Ctimespec undefined (type *syscall.Stat_t has no field or method Ctimespec) stat_t.Ctim undefined (type *syscall.Stat_t has no field or method Ctim) 在进行go build时报错。原因是 Ctimespec 适用于darwin;而linux需要用Ctim linux int64 fileInfo, _ := os.Stat(pa

ZzZsheng的博客 2942

Microchip Studio 7.0 从下载到项目调试:AVR开发者的完整入门指南(附常见问题解决)

本文为AVR开发者提供了Microchip Studio 7.0从下载安装到项目调试的完整入门指南。详细介绍了如何获取安装包、创建第一个AVR工程项目,并配置编译与调试环境。同时,文章重点解决了开发过程中常见的编译错误和仿真问题,帮助开发者快速上手并高效使用这一官方集成开发环境。

joy55的博客 336

APUE2错误记录

    在14年5月份的时候,看APUE2的信号处理章节,看到“10.10 alarm和pause函数”的时候,其中有一个例子是“超时功能的read函数”;我当时试了试这个代码,但是发现,并没有超时功能,并且在chinaunix论坛上发了提问帖(链接:http://bbs.chinaunix.net/thread-4135617-1-1.html)。    具体代码如下:   #inclu...

C++菜鸟之C++之旅 316

ZYNQ-7035+HMCAD1511高速数据采集系统设计

高速数据采集是电子测量、雷达信号处理与通信基带验证的核心技术基础,其性能瓶颈常集中于采样率、通道同步性与实时处理能力。基于ADC采样原理与SoC异构架构,高带宽、低抖动时钟链路与FPGA+ARM协同处理成为突破关键。ZYNQ-7035凭借275K逻辑单元与千级DSP资源,显著提升LVDS数据流吞吐与片上滤波/触发等实时算法部署能力;HMCAD1511则以1GSPS四通道同步采样和8位分辨率,满足示波器级动态范围需求。该组合广泛应用于嵌入式信号采集平台开发、教学实验系统构建及国产化仪器原型验证。

weixin_28939623的博客 262

攻防世界 web高手进阶区 9分题 Web_python_flask_sql_injection

继续ctf的旅程,开始攻防世界web高手进阶区的9分题,本文是Web_python_flask_sql_injection的writeup

闵行小鱼塘 1473

《UNIX环境高级编程》源码编译方法

 最近在学习《UNIX环境高级编程》(Advanced Programming in the UNIX Environment, 简称APUE,以下使用简称)。该书的作者是W.Richard.Stevens,国际知名的UNIX和网络专家。我看的是该书的第一版,尤晋元翻译的。网上有的评论该书翻译的比较差劲,有的说还行。我个人觉得,这本书的翻译还可以。并且,如果本身就有一定的UNIX/Linux基础的

rnarldo的学习天地 1045

30分钟搭建AI科研写作工作台:基于WorkBuddy的论文全流程加速实践

在人工智能技术日益普及的今天,如何利用智能工具提升专业领域工作效率成为关键课题。其核心原理在于通过模块化设计,将复杂的任务流程拆解为可复用、可编排的标准化技能单元,并结合精准的指令控制,实现从通用对话到深度任务执行的转变。这一技术价值在于显著降低重复性劳动强度,将人的创造力聚焦于核心决策与创新环节。在科研写作、数据分析、代码开发等场景中,这类智能工作台能有效辅助完成文献调研、内容生成、格式校验等繁琐步骤。本文以科研论文写作为具体应用场景,深入探讨如何利用WorkBuddy这一智能工作台,通过配置核心科研技能

weixin_29032489的博客 1524

APUE2-学习-环境配置

APUE2-学习-环境配置

SJWL2012的专栏 563

【WSL】window11 安装WSL2配置conda环境及mlatom环境搭建

写这篇文章之前自己安装过两次环境,可能每次都会产生碰到同样的问题,为了搭建适合自己的虚拟环境保证每一步的正确性,按顺序记录一下。

wangxiancao的博客 1630

偏最小二乘结构方程(PLS-SEM)_TomatoSCI分析日记

①模型整体拟合指标(Goodness-of-Fit, GOF),这个可以看做整体的R方了,上限是1;②指标载荷的具体值;然而,当数据中包含潜变量(即由多个观测指标组合而成的综合概念)时,贝叶斯结构方程不太适用。指标过少(1-2 个)会削弱潜变量的解释力,而指标过多可能增加噪声,影响模型稳定性。如果指标较多,可考虑进一步划分潜变量,但应确保每个指标有意义。掌握这两类方法后,在处理多变量、因果或路径分析研究时,可以根据数据特点与研究需求灵活选择。对于一般的多变量研究,这两类结构方程均为常用且有效的分析方案。

qq_44684643的博客 2011

apue2.h找不到 处理方法 《unix环境高级编程》

1.APUE2源代码下载:http://www.apuebook.com/src.tar.gz2.我保存到了/root下.解压缩:tar -xzvf src.tar.gz3.cd apue.2e进入apue.2e目录,查看README,告诉我们linux系统只要修改Make.defines.linux再make4.vi Make.defines.linux 修改WKDIR=/root/apue

谷雨 2114

图神经网络实战——利用节点回归预测网络流量

在机器学习中,回归指的是对连续值的预测。通常与分类形成鲜明对比,分类的目标是找到正确的类别(即离散值,而非连续值)。在图数据中,分类和回归分别对应于节点分类和节点回归。在本节中,我们将尝试预测每个节点的连续值,而非分类变量。

盼小辉丶的博客 1万+

APUE-文件与目录:dup与dup2

dupyu

u012839809的专栏 564

【100%通过率】华为od统一考试B卷【查找接口成功率最优时间段】Python 实现

服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数, 给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值,即平均失败率小于等于minAverageLost,找出数组中最长时间段,如果未找到则直接返回NULL。

MISAYAONE的博客 5871

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

APUE-2文件/目录

文件/目录

XXXXX的专栏 557

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

apue:文件和目录(2)

unix系统的文件与目录相关的函数和概念。

Mr_Avin的博客 583

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

APUE_chapter4 文件和目录 part2

4.6 新文件和目录的所有权 1、新文件的用户ID设置为进程的有效用户ID。2、新文件的组ID可以是进程的有效组ID。3、新文件的组ID也可以是它所在目录的组ID。 4.7 函数access和 faccessat  #include #include #include #include int main(int argc, char* argv[]){ if (arg

shiyang6017的博客 327

【APUE 学习笔记】2: Unix文件和目录

本文是APUE第四章:文件和目录知识点的总结和代码实践的总结。

Small Flows 777

APUE ---文件和目录2

13、link,unlink,remove和rename函数 intlink(constchar*pathname,constchar*newpath); 任何一个文件可以有多个目录项指向其i节点。此函数创建一个新目录项,它引用现有的文件,如果newpath已经存在,则出错。 注意:只创建newpath的最后一个分量,路径中的其他部分也应当存在。 ...

weixin_34233679的博客 90

《apue》读书笔记 第四章 文件和目录(2)

第四章 文件和目录7.umask函数当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。即,umask是从权限中“拿走”相应的位。对于文件来说,权限的最大值是666,因为系统不允许你在创建一个文本文件时就赋予它执行权

jiange_zh的博客 751

[单刷APUE系列]第四章——文件和目录[2]

PS:原先写好文章了,结果备份Boom了,结果只好重写了一遍,文件系统部分本来是准备了图片的,但是现在没了。各位将就着看。 目录 [单刷APUE系列]第一章——Unix基础知识[1][单刷APUE系列]第一章——Unix基础知识[2][单刷APUE系列]第二章——Unix标准及实现[单刷APUE系列]第三章——文件I/O[单刷APUE系列...

weixin_34037515的博客 166

APUE(4)---文件和目录 (2)

七、函数umask   umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,这是少数几个没有出错返回函数中的一个。其中cmask是9个常量(S_IR/W/XUSR、S_IR/W/XGRP、S_IR/W/XOTH)中的若干个按位“或”构成的。 #include<sys/stat.h> mode_t umask(mode_t cmask); //返回值:之前的文件模式创...

weixin_30260399的博客 89

《UNIX环境高级编程》之apue

文件下载地址:http://www.apuebook.com/ 下载后解压到某文件夹,此处以 /home/user为例。 step1:修改apue.2e(也就是刚才解压出来的文件夹)中的Make.defines.linux,将”WKDIR=/home/xxx/apue.2e“修改为”WKDIR=/home/user/apue.2e“(此处的user即为用户名); step2:修改std文件...

weixin_30587927的博客 298

APUE.2e程序清单4-7举例分析

分析apue2e上的程序清单4-7 递归降序遍历目录层次结构,并按文件类型计数 。分析环境:FreeBSD 6.2-RELEASE,i386。 程序清单4-7,英文版即121页的Figure 4.22. Recursively descend a directory hierarchy, counting file type 为了便于程序的分析,我把原ftw4.c中用到的程序清单2-3

想法驱动实践! 889

CentOS上APUE开发环境搭建

安装wget的命令,要求root权限:yum -y install wget 安装gcc和make命令,要求root权限:yum install gcc make  获取APUE2的代码:wget http://www.apuebook.com/src.2e.tar.gz -P /home/Michael/src  tar zxvf /home/Michael/src/src.2e.tar.

行者无疆的专栏 1830
上一篇: APUE 1 文件I/O
下一篇: 使用Go实现了一个ping命令
openex
博客等级 码龄18年 12粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值