尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Linux系统编程1(文件操作、Makefile)

Linux系统编程1(文件操作、Makefile)
📅 发布时间:2026/6/19 16:58:33

一、前置基础:Linux 文件类型与 man 手册使用

1. Linux 的 7 种文件类型

通过ll命令查看文件属性时,第一列的字符标识文件类型,具体分类如下:

标识文件类型说明
d目录文件可通过cd命令进入,如drwxrwxr-x 10 linux linux 4.0K Sep 6 2021 .vimplus/
l软链接文件类似 Windows 快捷方式,如lrwxrwxrwx 1 linux linux 27 Sep 5 2021 .vimrc -> /home/linux/.vimplus/.vimrc
-普通文件包含文本、二进制等(如电影、照片、1.c、a.out),如-rw-rw-r-- 1 linux linux 3.4K Sep 22 11:28 .vimrc.custom.config
c字符设备文件字节流设备,有顺序、数据量小(绝大多数设备属于此类),如crw------- 1 root root 249, 0 Nov 27 17:06 rtc0
b块设备文件存储设备(U 盘、光盘、硬盘),按 512 字节块随机访问,如brw-rw---- 1 root disk 8, 0 Nov 27 17:06 sda
s套接字文件与网络通信相关
p管道文件与进程间通信相关

2. man 手册使用(查函数 / 命令必备)

Linux 提供的 man 手册是权威的帮助文档,不同章节对应不同类型的内容:

manman# 查看man手册自身的说明manxxx# 等价于man 1 xxx,查看xxx命令(1章:用户命令)man2xxx# 查看xxx系统调用函数(2章:系统调用)man3xxx# 查看xxx标准库函数(3章:C库函数)

3. 命令行参数

C 程序通过main函数的参数接收命令行输入,格式如下:

// 示例:./a.out 1 2 3 4 5 6#include<stdio.h>intmain(intargc,char*argv[]){// argc:命令行参数的总个数(包括程序名本身)// argv:字符串数组,存储每个参数内容printf("argc is %d\n",argc);inti=0;for(i=0;i<argc;i++){printf("%d %s\n",i,argv[i]);}return0;}

二、标准 IO(C 库函数)

标准 IO 是 C 语言封装的文件操作接口,带缓冲区,跨平台性好,核心围绕FILE*文件流指针操作。

1. 文件打开:fopen

FILE*fopen(constchar*pathname,constchar*mode);

①pathname:文件路径 + 文件名(如./test.txt)
②mode:打开模式,不同模式的规则如下:

模式说明注意事项
r只读,读写指针起始位置:文件开头目标文件必须存在,否则失败
r+读写,读写指针起始位置:文件开头目标文件必须存在,否则失败
w只写,读写指针起始位置:文件开头文件不存在则创建,存在则清空内容
w+读写,读写指针起始位置:文件开头文件不存在则创建,存在则清空内容
a追加写,读写指针起始位置:文件末尾文件不存在则创建,只写
a+追加写/读,写在末尾、读在开头文件不存在则创建

③返回值:成功返回FILE*指针(包含文件属性、读写位置等),失败返回NULL。

2. 文件读写:核心函数

(1)字符级读写

// 写一个字符:成功返回写入的字符,失败返回EOFintfputc(intc,FILE*stream);// 读一个字符:成功返回读到的字符,失败/文件结尾返回EOFintfgetc(FILE*stream);

(2)行 / 字符串级读写

// 写字符串:成功返回非负数,失败返回EOFintfputs(constchar*s,FILE*stream);// 读一行:成功返回s指针,失败/文件结尾返回NULL// size:最多读取的字符数(建议≥实际内容长度)char*fgets(char*s,intsize,FILE*stream);

(3)自定义大小读写(二进制 / 文本通用)

// 读文件:返回实际读取的字节数,0表示结尾,-1表示失败size_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream);// 写文件:返回实际写入的字节数size_tfwrite(constvoid*ptr,size_tsize,size_tnmemb,FILE*stream);

3. 文件关闭:fclose

intfclose(FILE*stream);

①必须调用!fopen会向系统申请资源,fclose用于释放资源,避免内存泄漏。
②返回值:成功返回 0,失败返回 EOF。

4. 标准流指针(系统默认打开)

Linux 启动程序时,默认打开 3 个标准流指针,无需手动fopen:

流指针说明示例
stdin标准输入(默认键盘)fgets(s, sizeof(s), stdin);
stdout标准输出(默认屏幕)fputs(s, stdout);
stderr标准错误输出(默认屏幕)fprintf(stderr, "xxx error\n");

5. 文件定位:fseek/ftell/rewind

用于调整文件读写指针位置(仅支持普通文件,不支持设备文件):

// 偏移读写指针:成功返回0,失败返回-1intfseek(FILE*stream,longoffset,intwhence);// whence取值:SEEK_SET(开头)、SEEK_CUR(当前)、SEEK_END(末尾)// 示例:fseek(fp, 0, SEEK_SET); // 指针回到开头// 获取当前指针偏移量(字节):成功返回偏移量,失败返回-1longftell(FILE*stream);// 复位指针到文件开头(等价于fseek(fp,0,SEEK_SET))voidrewind(FILE*stream);

6. 标准 IO 的缓冲区机制

标准 IO 的核心特性是带缓冲区,分为三类:

缓冲区类型大小适用场景刷新条件
行缓冲1K(1024 字节)终端交互(stdout)1. 遇到\n2. 缓冲区满 3. 程序结束 4.fflush刷新
全缓冲4K(4096 字节)文件读写1. 缓冲区满 2. 程序结束 3.fflush刷新
无缓冲0K错误输出(stderr)直接输出,无缓存

手动刷新缓冲区:fflush(FILE *stream)(如fflush(stdout)、fflush(fp))

三、文件 IO(系统调用)

文件 IO 是 Linux 内核提供的系统调用,无缓冲区,直接操作文件描述符(int 类型),适合设备文件操作。

1. 核心区别:标准 IO vs 文件 IO

特性标准 IO文件 IO
接口类型C 库函数(跨平台)系统调用(Linux 专属)
操作句柄FILE*文件流指针int文件描述符
缓冲区自带缓冲区(行 / 全 / 无)无缓冲区
适用场景普通文件(文本 / 二进制)设备文件、高性能场景
底层关系封装文件 IO 实现直接调用内核接口

2. 文件打开:open

#include<fcntl.h>intopen(constchar*pathname,intflags,mode_tmode);

①flags(必选):
基础模式:O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)
扩展模式:O_CREAT(创建文件)、O_TRUNC(清空文件)、O_APPEND(追加)
②mode(仅O_CREAT时需要):文件权限(如 0644)
③返回值:成功返回文件描述符(非负整数),失败返回 - 1。
注:最终文件权限是mode-mask(mask:0002)

3. 文件读写:read/write

// 读文件:返回实际读取字节数,0=结尾,-1=失败ssize_tread(intfd,void*buf,size_tcount);// 写文件:返回实际写入字节数,-1=失败ssize_twrite(intfd,constvoid*buf,size_tcount);

fd:open 返回的文件描述符;
buf:数据缓冲区;
count:期望读写的字节数。

4. 文件关闭:close

intclose(intfd);

注:释放文件描述符资源,成功返回 0,失败返回 - 1。

四、目录操作

Linux 中目录也是一种文件,需通过专用函数操作:

1. 操作步骤

打开目录 → 读取目录内容 → 关闭目录

2. 核心函数

#include<dirent.h>// 1. 打开目录:成功返回DIR*目录流指针,失败返回NULLDIR*opendir(constchar*name);// 2. 读取目录:成功返回dirent结构体指针,失败/结尾返回NULLstructdirent*readdir(DIR*dirp);// dirent结构体核心字段:d_name(文件名)、d_type(文件类型)// 3. 关闭目录:成功返回0,失败返回-1intclosedir(DIR*dirp);

注:文件名是字符串类型

五、Makefile:工程编译管理

Makefile 是 Linux 下的工程管理工具,实现 “一键编译”,解决多文件编译的繁琐问题。

1. 核心规则

目标:依赖 TAB 编译规则(必须以TAB开头)

2. 版本演进示例

版本 1:基础版

a.out:main.c func.c gcc main.c func.c-o a.out # 清除编译产物(无依赖) clean:rm-f a.out

版本 2:内置变量版

a.out:main.c func.c gcc $^-o $@ # $^:所有依赖文件;$@:目标文件 clean:rm-f $@

版本 3:自定义变量版(推荐)

# 自定义变量 SRC=main.c func.c # 源文件列表 APP=a.out # 目标程序名 FLAG=-g # 编译选项(-g:调试信息) # 编译规则 $(APP):$(SRC)gcc $^-o $@ $(FLAG)# 清除规则 clean:rm-f $(APP)

3. 常用命令

make # 编译生成目标文件(如a.out),未修改源文件则提示"up to date"make clean # 执行clean规则,清除编译产物

六、总结

Linux 文件操作的核心逻辑:
标准 IO(C 库):带缓冲、跨平台,适合普通文件,核心是FILE*;
文件 IO(系统调用):无缓冲、高性能,适合设备文件,核心是文件描述符;
目录操作:专用opendir/readdir/closedir函数;
Makefile:简化多文件编译,掌握变量和规则即可应对基础场景。

相关新闻

  • 解锁AMD Ryzen隐藏性能:SDT调试工具新手入门宝典
  • 基于SpringBoot + Vue的前后端分离在线考试系统
  • 跨平台词库迁移技术深度解析:企业级输入法数据同步解决方案

最新新闻

  • 2026重庆防水补漏维修团队实测盘点TOP4:重庆业主房屋渗漏修缮靠谱选择 - 宅安选房屋修缮
  • CANN/asc-devkit asc_mul_add函数
  • 【新】5p216基于Hadoop的CBA球员数据可视化分析系统的设计3(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 探索Awesome Agent Skills:如何通过1000+官方技能库提升AI助手生产力
  • HackberryPiCM5磁吸背板应用:如何使用MagSafe配件增强便携性
  • purl.js片段解析实战:处理hash路由和URL锚点参数

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号