1. 文件和元数据

每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number
一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是LInux内核通过数据结构表示的实体
inode存储相关联文件的元数据
 
ls -i 命令获取文件的inode number
 
/* obtaining the metadata of a file */
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat (const char *path, struct stat *buf);
int fstat (int fd, struct stat *buf);
int lstat (const char *path, struct stat *buf);

注意:lstat函数可以获取 符号链接的文件元数据,lstat() returns information about the link itself and not the target file

struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* permissions */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* last access time */
time_t st_mtime; /* last modification time */
time_t st_ctime; /* last status change time */
};

2. 目录

a directory contains a list of filenames, each of which maps to an inode number. Each name is called a directory entry, and each name-to-inode mapping is called a link
当打开给定目录中的文件,内核查询相应的inode编号,然后将inode编号传递给文件系统,文件系统使用inode编号来寻找相应的存储在物理介质中的文件
 
Reading a Directory’s Contents : 
/* creates a directory stream representing the directory given by name */
#include <sys/types.h>
#include <dirent.h>
DIR * opendir (const char *name);
/* returns the next entry in the directory represented by dir */
#include <sys/types.h>
#include <dirent.h>
struct dirent * readdir (DIR *dir);
/* closes the directory stream represented by dir */
#include <sys/types.h>
#include <dirent.h>
int closedir (DIR *dir);
/*
* find_file_in_dir - searches the directory 'path' for a
* file named 'file'.
*
* Returns 0 if 'file' exists in 'path' and a nonzero
* value otherwise.
*/
int find_file_in_dir (const char *path, const char *file)
{
struct dirent *entry;
int ret = ;
DIR *dir;
dir = opendir (path);
errno = ;
while ((entry = readdir (dir)) != NULL) {
if (strcmp(entry->d_name, file) == ) {
ret = ;
break;
}
}
if (errno && !entry)
perror ("readdir");
closedir (dir);
return ret;
}

3. 链接

each name-to-inode mapping in a directory is called a link.
Most files have a link count of 1,that is, they are pointed at by a single directory entry
当一个文件的链接计数减为0时,文件被标记为free,如果存在进程仍在使用此文件,则该文件将保留在文件系统中
 
Linux内核使用 a link count and a usage count 实现,一个文件只有其link count和usage count都为0时,才会从文件系统移除
 
硬链接:
/* creates a new link under the path newpath for the existing file oldpath */
#include <unistd.h>
int link (const char *oldpath, const char *newpath);
成功调用之后,oldpath and newpath refer to the same file
 
符号链接(软链接):
软链接可以跨文件系统,链接到任何文件
/* creates the symbolic link newpath pointing at the target oldpath */
#include <unistd.h>
int symlink (const char *oldpath, const char *newpath);

解链:

#include <unistd.h>
int unlink (const char *pathname);
Once no process has the file open, it is deleted
 

4. Copying and Moving Files

 
Unix没有提供可以直接复制文件和目录的系统调用
 
 copying a file src to a file named dst:
). Open src.
). Open dst, creating it if it does not exist, and truncating it to zero length if it does exist.
). Read a chunk of src into memory.
). Write the chunk to dst.
). Continue until all of src has been read and written to dst.
). Close dst.
). Close src.
 

5. 块设备

The null device lives at /dev/null. The kernel silently discards all write requests to the device. All read requests to the file return end-of-file (EOF).
The zero device lives at /dev/zero.  读此设备返回null字符,写此设备被丢弃
The full device lives at /dev/full.  读此设备返回null字符,写此设备将触发错误表示设备已满
The kernel's random number generators live at /dev/random. 

Linux System Programming 学习笔记(八) 文件和目录管理的更多相关文章

  1. 【Linux】Shell学习笔记之四——文件和目录管理(硬连接和软连接)

    在这节将要学习linux的连接档,在之前用"ls -l" 查看文件属性的命令时, 其中第二个属性是连接数.那么这个连接数是干什么的?这就要理解inode. 先说一下文件是怎么存储的 ...

  2. Linux System Programming 学习笔记(二) 文件I/O

    1.每个Linux进程都有一个最大打开文件数,默认情况下,最大值是1024 文件描述符不仅可以引用普通文件,也可以引用套接字socket,目录,管道(everything is a file) 默认情 ...

  3. CentOS学习笔记--基本命令--文件与目录管理

    Linux基本命令--文件与目录管理 本节节选自鸟哥的 Linux 私房菜 -- 基础学习篇目录  第七章.Linux 文件与目录管理  ls(文件与目录的检视) ls命令就是list的缩写,ls可以 ...

  4. Linux System Programming 学习笔记(一) 介绍

    1. Linux系统编程的三大基石:系统调用.C语言库.C编译器 系统调用:内核向用户级程序提供服务的唯一接口.在i386中,用户级程序执行软件中断指令 INT n 之后切换至内核空间 用户程序通过寄 ...

  5. Linux System Programming 学习笔记(四) 高级I/O

    1. Scatter/Gather I/O a single system call  to  read or write data between single data stream and mu ...

  6. Linux System Programming 学习笔记(十一) 时间

    1. 内核提供三种不同的方式来记录时间 Wall time (or real time):actual time and date in the real world Process time:the ...

  7. Linux System Programming 学习笔记(九) 内存管理

    1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系 ...

  8. Linux System Programming 学习笔记(七) 线程

    1. Threading is the creation and management of multiple units of execution within a single process 二 ...

  9. Linux System Programming 学习笔记(六) 进程调度

    1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进 ...

随机推荐

  1. ps基础实例

    一:合并多个图片 1.先新件一个图片)CTRL+N),大小定成你想要的大小 2.把你要放入的照片用PS打开 3.把放入的照片用移动工具(V)拉到新件的图片里面 4.用CTRL+T调整大小(按住SHIF ...

  2. JDBC连接数据库报错:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. ......

    问题:Java程序使用JDBC连接MySQL数据库时,控制台报错如下: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' ...

  3. 【构造题 贪心】cf1041E. Tree Reconstruction

    比赛时候还是太慢了……要是能做快点就能上分了 Monocarp has drawn a tree (an undirected connected acyclic graph) and then ha ...

  4. RabbitMQ学习(二):Java使用RabbitMQ要点知识

    转  https://blog.csdn.net/leixiaotao_java/article/details/78924863 1.maven依赖 <dependency> <g ...

  5. python--以1-31的数字作为结尾的列表?论英文好的重要性!

    一.python基础教程第2板(修订版)[代码清单2-1]中有一段要求打印‘以1-31的数字作为结尾的列表’ 截取代码示例:endings =['st','nd','rd'] +17*['th'] + ...

  6. SSH框架面试总结----1

    1:struts2的工作流程 1)客户端浏览器发出HTTP请求. 2)根据web.xml配置,HTTP请求会被FilterDispatcher接收. 3)根据struts.xml,找到对应的Actio ...

  7. Java-JFrame开发汇总整理

    Java-JFrame开发汇总整理 在CS框架下,可以通过java代码开发JFrame弹窗体的功能,即类似于QQ登录等安装在计算机中的程序,通过java开发CS中C即客户端的一般用到的知识点如下: 一 ...

  8. windows charles 抓包https请求

    charles证书     2.设置host和端口 3.浏览器访问即可抓到https的请求  

  9. 前端MVVM模式及其在Vue和React中的体现

    MVVM相关概念 Mvvm 前端数据流框架精讲 1) MVVM典型特点是有四个概念:Model.View.ViewModel.绑定器.MVVM可以是单向绑定也可以是双向绑定甚至是不绑定 2) 绑定器: ...

  10. 《linux设备驱动开发详解》笔记——12linux设备驱动的软件架构思想

    本章重点讲解思想.思想.思想. 12.1 linux驱动的软件架构 下述三种思想,在linux的spi.iic.usb等复杂驱动里广泛使用.后面几节分别对这些思想进行详细说明. 思想1:驱动与设备分离 ...