博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.0 Linux文件系统
阅读量:4111 次
发布时间:2019-05-25

本文共 3713 字,大约阅读时间需要 12 分钟。

目录
  1. Linux(Unix)文件类型表
  2. 硬链接与软链接
  3. proc 文件系统

Linux(Unix)文件类型
文件类型 ls 缩写 应用
常规文件 - 保存数据
目录 d 存放文件
符号链接 l(小写的 ’L‘) 指向其他文件
字符设备节点 c 访问设备
块设备节点 b 访问设备
命名管道函数 p 进程间通信
套接字 s 进程间通信

硬链接与软链接
  1. Linux 文件的组成部分:文件名(dentry,目录项),inode 节点(保存该文件的元数据信息,metadata),文件内容(data)。每个文件都有这三层结构:dentry / inode / data, dentry 含有文件名并关联 inode, inode 含有文件元数据并指向数据区(data),如下图:
    Linux 文件组成
  2. 硬链接:inode 中会记录文件的链接数,也就是引用该文件(inode)的 dentry (目录项/文件名)数目,通常常规文件只有一个文件名,链接数为 1。创建硬链接 即新建 dentry(目录项)指向该文件的 inode。一个 inode 可同时被多个 dentry 引用,其中每个 dentry(即目录项/文件名)都是平等的!
    建立硬链接
  3. 建立硬链接:新建文件 data.txt,为其创建 2 个硬链接,1 个软链接。可见硬链接会增加被链接文件 data.txt 的链接数,而软链接并不会对被链接文件的链接数产生影响。
ubuntu@cuname:~/test$ ls -ltotal 0ubuntu@cuname:~/test$ touch data.txt             // 新建文件 data.txtubuntu@cuname:~/test$ ls -ltotal 0-rw-rw-r-- 1 ubuntu ubuntu 0 Apr  6 23:50 data.txtubuntu@cuname:~/test$ ln data.txt 2data.txt      // 创建硬链接ubuntu@cuname:~/test$ ls -ltotal 0-rw-rw-r-- 2 ubuntu ubuntu 0 Apr  6 23:50 2data.txt-rw-rw-r-- 2 ubuntu ubuntu 0 Apr  6 23:50 data.txtubuntu@cuname:~/test$ ln data.txt 3data.txt      // 创建硬链接ubuntu@cuname:~/test$ ls -ltotal 0-rw-rw-r-- 3 ubuntu ubuntu 0 Apr  6 23:50 2data.txt-rw-rw-r-- 3 ubuntu ubuntu 0 Apr  6 23:50 3data.txt-rw-rw-r-- 3 ubuntu ubuntu 0 Apr  6 23:50 data.txtubuntu@cuname:~/test$ ln -s data.txt 4data.txt   // 创建软链接ubuntu@cuname:~/test$ ls -ltotal 0-rw-rw-r-- 3 ubuntu ubuntu 0 Apr  6 23:50 2data.txt   // 硬链接-rw-rw-r-- 3 ubuntu ubuntu 0 Apr  6 23:50 3data.txt   // 硬链接lrwxrwxrwx 1 ubuntu ubuntu 8 Apr  6 23:51 4data.txt -> data.txt  // 软链接-rw-rw-r-- 3 ubuntu ubuntu 0 Apr  6 23:50 data.txt    // 原始文件

图示如下:

创建硬链接和软链接
4. 软链接:如上图所示,软链接其实是一个新文件 (和硬链接不同,硬链接仅仅创建了一个新的 dentry,并指向原文件的 inode),软链接同时带有其新创建的 inode。软链接不是一个常规文件,而是一个符号链接(symbolic link)。该符号链接并不保存实际的数据,而是保存另一个文件的名称。当需要 Linux 内核查找该符号链接时,它就自动把这个符号链接解析为那个文件的文件名。使用这个符号链接的用户(或进程)并不知道其中的差别。

实验
  1. 代码如下(代码很简洁:读取文件 data.txt 的内容):
#include 
#include
#include
void main(){
int res = 0; char buf[5]; buf[0] = '\0'; // 将字符串初始化为空串 // 不论是硬链接还是软链接,读取文件时,都存在路径问题,最好的方式是使用绝对路径 FILE *fd = fopen("/tmp/data.txt", "r"); if(fd == NULL){
printf("file:data.txt is not found.\n"); exit(EXIT_FAILURE); } // sleep(50); res = fread(buf, 1, 4, fd); if(res >= 0){
// 处理字符串结尾 buf[res] = '\0'; } printf("result is \"%s\"\n", buf); // 正确输出为‘1234’}

文件 data.txt 内容如下:

ubuntu@cuname:~/dev/beginning-linux-programming/test/d1$ echo "123456789" > /tmp/data.txtubuntu@cuname:~/dev/beginning-linux-programming/test/d1$ more /tmp/data.txt123456789

注:创建软链接时,目标文件必须使用绝对路径。而创建硬链接时,可以使用相对路径。


proc 文件系统
  1. Linux 提供了一个特殊的文件系统 procfs,它通常以 ‘/proc’ 目录的形式呈现。该目录中包含了许多特殊文件用来对驱动程序和内核信息进行更高层的访问。
  2. 查询 cpu 信息
ubuntu@cuname:/proc$ cat cpuinfo processor	: 0vendor_id	: GenuineIntelcpu family	: 6model		: 142model name	: Intel(R) Core(TM) i5-7200U CPU @ 2.50GHzstepping	: 9microcode	: 0x84cpu MHz		: 2711.997...
  1. 查询内存信息
ubuntu@cuname:/proc$ cat meminfoMemTotal:        4016440 kBMemFree:         1326624 kBMemAvailable:    2176944 kBBuffers:          106916 kBCached:           925356 kB...
  1. 使用 proc 文件系统,查询某个进程打开的文件描述符(如下查询上述的文件读取程序运行时打开的文件描述符)
// 运行程序 (程序打开文件后,会睡眠 50 秒)ubuntu@cuname:~/dev/beginning-linux-programming/test$ gcc -o test1 test1.cubuntu@cuname:~/dev/beginning-linux-programming/test$ ./test1// 查找进程 pid 为 7904ubuntu@cuname:/proc$ ps uUSER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDubuntu     7904  0.0  0.0   4352   652 pts/18   S+   11:14   0:00 ./test1// 进行查询操作// 进入指定进程目录ubuntu@cuname:/proc$ cd /proc/7904/ // fd 目录ubuntu@cuname:/proc/7904$ ls -ldr-x------ 2 ubuntu ubuntu 0 Apr  7 11:14 fd // 可以看到当前打开的文件 ‘/tmp/data.txt’,其描述符为 3ubuntu@cuname:/proc/7904$ ls -l fdlr-x------ 1 ubuntu ubuntu 64 Apr  7 11:14 3 -> /tmp/data.txt

转载地址:http://yclsi.baihongyu.com/

你可能感兴趣的文章
CMYK颜色模型
查看>>
光照模型
查看>>
材质模型
查看>>
光滑着色
查看>>
自动计算顶点缓冲中所有顶点的法线
查看>>
struct 与class的关系
查看>>
cmake和make区别(转载)
查看>>
IntelliJ IDEA 14.0.2破解注册码文件
查看>>
Java 代码优化过程的实例介绍
查看>>
处理错误:ORA-27101: shared memory realm does not exist记实
查看>>
值得推荐的C/C++框架和库 (真的很强大)
查看>>
Json 解析
查看>>
转:LibCurl HTTP部分详细介绍
查看>>
C++ 制作 json 数据 并 传送给服务端(Server) 的 php
查看>>
C++网络通信库性能大比拼
查看>>
cout 与wcout
查看>>
Windbg 32位版本和64位版本的选择
查看>>
the CDB process terminated
查看>>
Decoda编译方法
查看>>
MySQL表不能修改、删除等操作,卡死、锁死情况的处理办法。
查看>>