linux学习笔记之文件结构和函数

一、基础介绍。

1:文件的构成。

  1,首先声明,这里的文件和目录,仅仅表示普通的文件和目录。不代表设备,管道等特殊形式的文件(UNIX把它们也当作文件处理)。

  2,目录的构成:v节点编号和文件名。

    1)v节点:文件系统相关的节点。文件类型,各类文件操作函数指针。但目录中包含的是节点编号,不是节点本身。

  3,文件的构成:v节点和i节点。

    1)i节点:文件所有者,长度,磁盘实际所在位置指针等。

    2)linux中,没有v节点,只有两个i节点。一个和文件系统相关,一个无关。

    3)链接文件的实际内容(数据块数据)为实际文件的文件名。

2:文件描述符:在进程中,用来搜索文件的索引值。

  1,进程查找文件需要:记录表,文件表,V节点表。

    1)每个进程都会有一张记录表。文件描述符占用记录标中的一项。每一项会对应一个文件表的指针。

    2)文件表:记录文件状态,当前偏移量,v节点指针。

      1.文件状态表示:读写,添写,同步,阻塞...

  2,通过文件描述符查找文件的流程。

    1)通过文件描述符 —— 文件表 —— 找到v节点 —— 找到数据i节点。

  3,描述符是数值上为 非负整数。

  3,标准输入,标准输出,标准错误通常占用0,1,2这3个端口。很多shell和应用程序都默认支持此规则。所以如果更改此规则可能会导致系统和程序无法使用。

文件               对应描述符          POSIX的宏(include<unistd.h>) standard input、   0          STDIN_FILENO
standard output    1          STDOUT_FILENO
standard error     2          STDERR_FILENO

  4,宏OPEN_MAX 定义了最大打开文件数。描述符最大值为:OPEN_MAX-1

二、相关操作函数。

1:函数列表。

1 打开文件
  open(const char *path, int oflag, mode_t mode);
  openat(int fd, const char *path, int oflag, mode_t mode);
  // 1 fd:文件描述符。当openat函数第二参数path为相对路径时使用。得到相对路径的前置路径。
  // 2 oflag:有5个基本常量参数(不可多选),以及一些可选常量参数。
  // 3 openat函数使用:可以使用相对路径来访问文件,使函数更为灵活。
2 创建/删除一个文件
  creat(const char *path, mode_t mode ), close( int fd )
  // 1 creat函数等效于open(path, O_WRONLY| O_CREAT | O_TURNC, mode )
  // 2 关闭文件时,还会释放该进程在文件上添加的记录锁。
  // 3 当进程结束时,内核会自动关闭关联文件。
3 读/写 文件
  size_t read( int fd, void *buf, size_t nbytes );
  size_t write( int fd, const void *buf, size_t nbytes );
  // 1 read函数中返回值为 读到的字数, 第二参数保存 读到的字符的起始位置的指针。
  // 2 两个函数出错时,返回值为-1。
  // 3 write函数仅将数据写入缓存。写入磁盘时间由系统控制。如期望立即写入,需要设置:O_SYNC。
4 设置文件偏移量(针对已打开文件)
  lseek( int fd, off_t offset, int whence )
  // 1 whence有三个选项:SEEK_SET / CUR / END 分别表示 偏移量从  开始处 / 当前为指 / 结束点  开始。
  // 2 部分操作系统默认: SEEK_SET / CUR / END 分别为 0 / 1 / 2。
5 复制现有的文件描述符。
  int dup( int fd );
  int dup2( int fd, int fd2 );
  // 1 需要包含"unistd.h"头文件
  // 2 复制一个现有文件描述符 到 当前最小空余的文件描述符位。
6 将缓存区写入磁盘
  // 默认保存在缓冲区,等待内核写入。
  int sync( int fd );  // 发送写入指令,但不等待写返回。
  int fsync( int  fd ); //发送写入指令,并等待返回。
  int fdatasync( int fd ); //仅更新数据部分,不更新文件属性。
7 设置文件属性(针对已打开文件)
  int fcntl( int fd, int cmd, int arg )
  // 1 复制一个已有描述符。
  // 2 get/set 文件描述符/文件状态标志/异步IO所有权/记录锁。
  // 3 修改 文件描述符/文件状态标志位时,注意先获取,确定正确,再赋值。防止出错。
8 获取文件相关信息。
  int stat( const char *restrict pathname, struct stat *restrict buf )
  int fstat( int fd, struct stat *restrict buf )
  int lstat( const char *restrict pathname, struct stat *restrict buf )
  int fstatat( int fd, const char *restrict pathname, struct stat *restrict buf, int flag )
  // 1 结构体 stat 保存 文件有关的信息。
  // 2 fstatat函数根据 参数flag 来决定具体作用。是上三种函数的集合体。
  // 3 lstat可以用来获取 符号链接 类型的文件的信息。9 检测实际用户/组对文件的权限。  int access( const char *pathname, int mode )  int faccssat( int fd, const char *pathname, int mode, int flag )  // 1 return : success is 0, failure is -1  // 2 通常是因为设置ID,导致有效ID和实际ID不同时,才会使用。  // 3 faccessat函数的 参数flag 设置为 AT_EACCESS 时,检测的是有效ID 而非实际。10 j

30:umask函数:设置屏蔽字。进程创建一个文件时,使用此屏蔽字来确定该文件的读写权限。

  1,函数原型:mode_t umask( mode_t cmask );

  2,例:用户写 置位,则创建的文件, 用户没有写权限。

  3:linux的shell指令中,有umask此命令。可以用来查看默认的置位情况。用四个8进制表示。

    1,第一位用来表示文件类型(目录,文件或其他)

    2,第二为用户权限,三为组,四为其他组。

31:chmod, fchmod, fchmodat函数:更改现有文件权限。

  1,函数原型。

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

    2)int fchmod( int fd, mode_t mode )

    3)int fchmodat( int fd, const char *pathname, mode_t mode, int flag )

  2,flag 为 AT_SYMLINK_NOFOLLOW时,函数不跟随符号链接。

  3,可在执行时,设置用户/组ID。

34:chown, fchown, fchownat, lchown函数:更改用户/组ID

  1,函数原型:

    1)int chown( const char *pathname, uid_t owner, gid_t group )

    2)int fchown( int fd, uid_t owner, gid_t group )

    3)int fchownat( int fd, const char* pathname, uid_t owner, gid_t group, int flag )

    4)int lchown( const char* pathname, uid_ owner, gid_t group )

  2,lchown用来更改符号链接本身的ID。(或flag为AT_SYMLINK_NOFOLLOW)

  3,一般而言,指用root用户可以更改一个文件的所有者。具体系统对此的要求不明。

36:truncate, ftruncate函数:将文件截断为固定大小。

  1,函数原型:

    1)int truncate( const char* pathname, off_t length )

    2)int ftruncate( int fd, off_t length )

38:link, linkat, unlink, unlinkat, remove函数:增加/删除文件链接。

  1,函数原型:

    1)int link( const char* existingpath, const char* newpath)

    2)int linkat( int efd, const char* existingpath, int nfd, const char* newpath, int flag)

    3)int unlink( const char* pathname)

    4)int unlinkat( int fd, const char *pathname, int flag)

    5)int remove( const char* pathname )

  2,删除文件需求:链接计数器为0,文件为关闭状态。

    1)当由进程打开文件时,文件无法被删除。

    2)流程:关闭一个文件时,内核首先检查打开文件的进程个数;如果计数为0,内核再检查其链接计数,如果链接计数也为0,则删除该文件。

    3)该特性可以用来保证,临时文件不会被遗留下来。(因为进程关闭后,两个计数都为0)。

39:rename/at函数:对文件重命名。

  1,函数原型:

    1)int rename( const char *oldname, const char* newname )

    2)int renameat( int oldfd, const char *oldname, int newfd, const char* newname )

  2,不能对文件 ‘.’/‘..’ 两个文件进行重命名。

40:symlink/at函数:创建一个符号链接。

  1,函数原型:

    1)int symlink(const char *actualpath, const char *sympath )

    2)int symlinkat(const char *actualpath, int fd, const char *sympath )

41:readlink/at函数:读取符号链接本身(不索引实际文件),并且读取链接中的内容(即文件名)。

  1,函数原型:

    1)ssize_t readlink( const char *restrict pathname, char *restrict buf )

    2)ssize_t readlinkat( int fd,  const char *restrict pathname, char *restrict buf, size_t bufsize )

43:futimens, utimensat, utimes函数:更改一个文件的访问和修改时间。

  1,函数原型:

    1)int futimens( int fd, const struct timespac time[2] )

    2)int utimensat( int fd, const char *path, const struct timespac times[2], int flag)

    3)int utimes( const char* pathname, const struct timeval times[2] )

  2,time参数中,第一个为访问时间,第二个为修改时间。

44:mkdir, mkdirat, rmdir函数:创建/删除目录

  1,函数原型:

    1)int mkdir( const char* pathname, mode_t mode)

    2)int mkdirat( int fd, const char* pathname, mode_t mode)

    3)int rmdir( const char *pathname )

  2,需注意,rmdir的执行规则(进程打开计数,链接计数等)。

45:chdir, fchdir, getcwd函数:更改当前工作目录(默认目录)。

  1,函数原型:

    1)int chdir( const char * pathname );

    2)int fchdir( int fd );

    3)char* getcwd( char *buf, size_t size );  //通过 相对路径 得到 绝对路径。

46:fwide函数:设置流的定向。

  1,函数原型:int fwide( FILE *fp, int mode );

2:历史遗留问题:高编3章后习题无法理解。待看完后重新尝试解决。

时间: 2024-10-08 18:17:40

linux学习笔记之文件结构和函数的相关文章

Linux学习笔记——例说makefile 增加系统共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

嵌入式Linux学习笔记之LED驱动

最近在学习嵌入式Linux驱动开发,大致了解了驱动的基本开发流程,本文主要针对字符设备驱动开发做一个简要介绍,也当作是对这几天工作的一个小小总结. 计算机系统是由软硬件相互协调共同完成工作的,作为专用计算机系统的嵌入式系统也不例外,既要有CPU.SDRAM.FLASH.IO等硬件,同时也少不了操作系统和应用软件等软件的支持,而作为应用程序与硬件的桥梁--驱动程序,是整个嵌入式系统开发过程中的关键环节.驱动开发涉及底层,而了解底层作用机制对于整个系统的开发意义重大. Linux内核中有60%以上是

Linux学习笔记——例说makefile 增加自定义共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

&lt;LINUX &gt;bash shell 入门 --linux学习笔记

首先说下我个人对于shell的理解,我觉得shell是一种通过各种控制语句将linux命令进行集合实现批处理的一种脚本语言. shell编程入门其实很简单,语法知识并不多,但是高级shell编程就很难,因为shell是用户和linux之间的桥梁,要编写高质量的shell脚本,就需要用户对linux有很全面的认识. 这里我们只分析shell脚本的语法知识,如想透彻的学习linux还需多努力. shell结构       1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建she

马哥Linux学习笔记之三——加密

1.明文传输 ftp,http,smtp,telnet 2.机密性:plaintext-->转换规则-->ciphertext ciphertext-->转换规则-->plaintext 完整性:单项加密算法,提取数据特征码.输入一样,输出必然一样:雪崩效应,输入的微小改变,将会引起结果的巨大改变:无论原始数据是多少,结果大小都是相同的:不可逆,无法根据特征码还原原来的数据. 3.密钥 4.对称加密:有加密算法,有密钥 5.密钥交换算法 IKE(Internet Key Excha

linux学习笔记(一)-文件目录相关的命令&&文件通配符

一.几个命令概述 1.查看目录以及目录底下的文件:ls(-a显示隐藏文件:-d显示目录本身:-l显示详细内容:-R递归显示,即把子目录的文件也显示出来:-h以更加被人类理解的格式显示,比如显示文件大小的时候用M为单位显示:-i显示文件索引ID) 2.查看文件内容:cat,head,tail,less,more,tac cat:将文件连接起来,输出在屏幕上,可接多个文件(-E:显示隐藏的换行符:-n:显示出行号) head:默认查看文件的前10行(-n#:查看文件的前#行.空白行也是一行) tai

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma

Linux学习笔记——如何使用echo指令向文件写入内容

0.前言 本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符. echo向文件中输出内容的基本方法是使用IO重定向指令--">",默认情况下echo输出到标准输出中,使用>指令可重定向输出到文件中. 1.echo指令基本用法 [1]Linux官方用户手册--echo指令 [2]输入指令获得帮助 sudo echo --help 返回内容如下 用法:echo [短选项]... [字

linux学习笔记--vim程序编辑器

1,在linux系统中使用文本编辑器来编辑自己的linux参数配置文件是一件很重要的事情,因此系统管理员至少应该要熟悉一种文本编辑器. 2,不同的linux distribution各有不同的附加软件,linux命令行界面下的文本编辑器有Emacs,pico,nano,joe与vim 3,学习vim的重要性 (1)所有的UNIX Like系统都内置vi文本编辑器,其他的文本编辑器不一定存在 (2)很多软件的编辑接口都会主动调用vi (3)vim具有程序编辑的能力,可以主动以字体颜色辨别语法的正确