news 2026/4/15 14:49:50

跟我学C++中级篇——Linux中文件和链接及重定向

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跟我学C++中级篇——Linux中文件和链接及重定向

一、Linux中的文件

在前面学习网络句柄等知识点时,提到过,在Linux中,一切皆文件。所以文件可以从广义和狭义两个层次来描述。狭义的文件,其实是就是大家在硬盘中看到的各种文件,包括什么mp3,mp4等音视频文件,.h,.cpp等C++源码文件以及最常见的txt文本文件等等。也就是说,磁盘中存在的存储的资源都可以称为文件。
而从广义上理解,则一切都是文件,如网络通信的句柄、事件的句柄、U盘以及键盘等外设、设备等等也都是文件。这样的好处在于从抽象层次上,统一了所有的管理和操作行为。这对于内核的开发变得更方便一致。

二、链接

在Linux中文件的链接又分为软链接和硬链接。软连接指通过ln -s创建的文件的链接,它类似于Windows上的快捷方式。如下命令:

ln -s sourceFileName linkSoftFileName #create unlink linFileName #remove

它有点类似于指针。单纯的删除软链接文件,并不会影响源文件本身;但是如果删除源文件,则软链接文件变得不可用。软链接是有独立的inode的,其内部存储的是源文件的地址。
硬链接是指直接使用ln创建的文件链接(和软链接区别在于是否有-s),如下命令:

ln sourceFileName linkhardFileName

硬链接类似于智能指针,通过引用计数器控制硬链接的数量,即在每个描述源文件的inode中生成一个文件映射即硬链接文件的映射,而没有真正的生成一个文件。所以单纯删除硬链接的源文件,是无法删除源文件的,只是删除了一个文件入口而已。
一般在源码中实现软硬链接可以使用库接口symlink(软链接)和link(硬链接)来实现。

三、重定向

在查看日志或者一些查询导出时,大家可能经常使用类似下面的命令:

cat top.log|grep abc >file.txt #输出重定向 cat < top.log #输入重定向

所谓重定向,其实就是将对文件句柄fd的操作目标改变(所谓重定向),也可以这样理解,就是将fd(指针)从原来指向的目标(内存地址)更改为指定的目标(新内存地址)。其具体的实现,一般来说可以先关闭原来的句柄再将新fd赋值即可。但为了方便在库中提供了一个dup2的接口函数,可以更方便的进行重定向实现。
需要提醒的是重定向命令有“>”和“>>”或“<”和“<<”两种,一种是单次重定向(即清除原有的内容只显示最新的);另外一种是追加重定向(可以不断追加更新内容)。

四、文件句柄的本质

无论是软硬链接还是重定向,本质都是对文件的管理和操作。而操作文件的本质是是对文件句柄的操作。而文件句柄fd即文件描述符在内核中被描述为files_struct:

structfiles_struct{/* * read mostly part */atomic_tcount;bool resize_in_progress;wait_queue_head_tresize_wait;structfdtable__rcu*fdt;structfdtablefdtab;/* * written part on a separate cache line in SMP */spinlock_tfile_lock ____cacheline_aligned_in_smp;unsignedintnext_fd;unsignedlongclose_on_exec_init[1];unsignedlongopen_fds_init[1];unsignedlongfull_fds_bits_init[1];structfile__rcu*fd_array[NR_OPEN_DEFAULT];//重点};

也就是通过fd_array来保存相关的文件描述符。而无论是开发者还是内核本身,想操作文件如open等,其实就是对这个数组的检索然后再进行的。而分配亦也是如此,找到第一个空的位置,然后再保存进去即可(一般来说,数组的前三个已经被标准的输入输出和错误占用)。

五、相关例程

下面给出一个基础的实现例程:

#include<iostream>#include<cstdlib>#include<fcntl.h>#include<fstream>#include<stdio.h>#include<sys/stat.h>#include<sys/types.h>#include<unistd.h>voidredirect(){intfd=open("./test.txt",O_CREAT|O_WRONLY|O_TRUNC,0644);if(fd<0){perror("open");return;}// fd复制到1dup2(fd,1);//重定向打印std::cout<<"hello ,redirect!!!"<<std::endl;close(fd);}intmain(){// 创建软链接symlink("test_demo.txt","soft.txt");// 创建硬链接link("test_demo.txt","hard.txt");redirect();return0;}

代码很简单,如果有不明白的地方上机运行一下就明白了。

六、总结

学习一些Linux的基本知识点时,完全可以从开发的角度来看。特别是内核是开源的,有什么不明白的细节,打开源码搜索到相关的位置就一目了然了。再次引用侯先生的话“源码之前,了无秘密”!再掌握了相关的应用后,从编码的角度再造一次轮子,可以更加深刻的理解设计的目的和思想,提高开发者自身的认知水平和编程方式。与诸君共勉!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 14:48:07

AI视觉落地新方向:M2FP多人解析+WebUI,打造轻量级生产环境

AI视觉落地新方向&#xff1a;M2FP多人解析WebUI&#xff0c;打造轻量级生产环境 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 项目背景与技术痛点 在AI视觉应用日益普及的今天&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 正成为智能零售、虚拟试衣、安…

作者头像 李华
网站建设 2026/4/15 12:30:44

实战案例:基于M2FP搭建在线试衣系统,WebUI快速集成图像解析服务

实战案例&#xff1a;基于M2FP搭建在线试衣系统&#xff0c;WebUI快速集成图像解析服务 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 在虚拟试衣、数字人生成、AR换装等前沿应用场景中&#xff0c;精准的人体语义分割是实现高质量视觉合成的核心前提。传统方法往往只能处…

作者头像 李华
网站建设 2026/4/15 14:14:30

springboot房产租赁管理系统

第一章 系统开发背景与SpringBoot适配性 当前房产租赁市场中&#xff0c;传统管理模式面临诸多痛点&#xff1a;房源信息分散在Excel表格或纸质档案中&#xff0c;查询与更新效率低&#xff0c;易出现“一房多租”风险&#xff1b;租客筛选依赖人工核验身份与资质&#xff0c;流…

作者头像 李华
网站建设 2026/4/8 16:36:58

低成本实现虚拟换装:M2FP镜像部署+Flask WebUI快速集成

低成本实现虚拟换装&#xff1a;M2FP镜像部署Flask WebUI快速集成 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 项目背景与技术价值 在虚拟试衣、AR换装、数字人生成等应用场景中&#xff0c;精准的人体语义分割是核心前置能力。传统方案依赖昂贵的GPU服务器和复杂的环境…

作者头像 李华
网站建设 2026/4/11 0:49:21

Python WebSocket自动化测试:构建高效接口测试框架

为了更高效地进行WebSocket接口的自动化测试&#xff0c;我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架&#xff0c;并重点关注以下四个方面的内容&#xff1a;运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…

作者头像 李华
网站建设 2026/4/1 4:31:13

汽车冲压工艺参数优化的核心方法与实战案例解析

理解工艺参数的关键作用冲压工艺在现代制造业中扮演着举足轻重的角色&#xff0c;尤其在汽车生产领域&#xff0c;其重要性不言而喻。从车身覆盖件到结构件&#xff0c;每一个零部件的成型都依赖于精准的工艺参数设置。然而&#xff0c;现实中许多企业仍面临着产品质量波动、生…

作者头像 李华