Linux文件操作与进程
一、目录操作目录操作遵循“打开 → 读取 → 关闭”的流程类似于文件操作。1. 打开目录 (opendir)#include dirent.hDIR *opendir(const char *name);功能打开一个目录获取目录流指针。参数name目标目录的路径。返回值成功返回DIR*类型的目录流指针失败返回NULL。代码示例#include stdio.h #include dirent.h int main() { DIR *dir opendir(.); if (dir NULL) { perror(opendir); return 1; } printf(目录打开成功\n); closedir(dir); // 记得关闭 return 0; }2. 读取目录 (readdir)#include dirent.hstruct dirent *readdir(DIR *dirp);功能读取目录流中的下一个目录项。参数dirp已打开的目录流指针。返回值成功返回指向struct dirent的指针读到末尾或出错返回NULL。struct dirent核心成员ino_t d_ino文件的 inode 编号。unsigned char d_type文件类型如DT_REG常规文件DT_DIR目录。并非所有文件系统都支持。char d_name[]以\0结尾的文件名最大长度通常为 256。代码示例列出当前目录所有内容#include stdio.h #include dirent.h int main() { DIR *dir opendir(.); if (dir NULL) { perror(opendir); return 1; } struct dirent *entry; while ((entry readdir(dir)) ! NULL) { printf(%s (类型: %d)\n, entry-d_name, entry-d_type); } closedir(dir); return 0; }3. 关闭目录 (closedir)#include dirent.hint closedir(DIR *dirp);功能关闭目录流释放资源。参数dirp目录流指针。返回值成功返回0失败返回-1。⚠️ 注意使用完目录后务必调用此函数否则会造成资源泄露。4. 创建目录 (mkdir)#include sys/stat.hint mkdir(const char *pathname, mode_t mode);功能创建一个新目录。参数pathname目录路径。mode权限通常为八进制数如0777并受umask影响。返回值成功返回0失败返回-1。代码示例#include stdio.h #include sys/stat.h int main() { if (mkdir(new_folder, 0777) -1) { perror(mkdir); return 1; } printf(目录创建成功\n); return 0; } 补充umask会屏蔽掉mode中的某些权限位创建出的目录实际权限是mode ~umask。5. 获取当前工作目录 (getcwd)#include unistd.hchar *getcwd(char *buf, size_t size);功能获取当前进程的工作路径。参数buf存储路径的缓冲区地址。size缓冲区大小。返回值成功返回buf失败返回NULL。代码示例#include stdio.h #include unistd.h #include limits.h // PATH_MAX int main() { char cwd[PATH_MAX]; if (getcwd(cwd, sizeof(cwd)) ! NULL) { printf(当前工作目录: %s\n, cwd); } else { perror(getcwd); return 1; } return 0; }6. 切换工作目录 (chdir)#include unistd.hint chdir(const char *path);功能将进程的当前工作目录更改为path。参数path目标路径。返回值成功返回0失败返回-1。代码示例#include stdio.h #include unistd.h int main() { if (chdir(/tmp) 0) { char cwd[256]; getcwd(cwd, sizeof(cwd)); printf(已切换到: %s\n, cwd); } else { perror(chdir); } return 0; }二、时间相关函数处理日历时间、时间戳和格式化时间。1. 获取时间戳 (time)#include time.htime_t time(time_t *tloc);功能获取自 1970-01-01 00:00:00 UTC 到现在的秒数。参数若tloc非空时间戳也存入*tloc。返回值当前时间戳time_t类型。代码示例#include stdio.h #include time.h int main() { time_t ts time(NULL); // 常用传NULL的方式 printf(当前时间戳: %ld\n, (long)ts); return 0; }2. 时间戳转字符串 (ctime)#include time.hchar *ctime(const time_t *timep);功能将时间戳转换为像Wed Jun 30 21:49:08 2026\n的可读字符串。参数指向时间戳的指针。返回值指向静态内存的字符串指针不可重入。代码示例#include stdio.h #include time.h int main() { time_t ts time(NULL); printf(当前时间: %s, ctime(ts)); // 字符串自带换行 return 0; }3. 时间戳分解 (localtime)#include time.hstruct tm *localtime(const time_t *timep);功能将时间戳转换为本地时区的日历结构体。参数指向时间戳的指针。返回值指向struct tm的指针静态内存不可重入。struct tm成员tm_sec(0-60),tm_min(0-59),tm_hour(0-23)tm_mday(1-31),tm_mon(0-11, 0代表1月),tm_year(从1900起算需加1900)tm_wday(0-6, 周日为0),tm_yday(0-365)代码示例自定义格式化输出#include stdio.h #include time.h int main() { time_t ts time(NULL); struct tm *ptm localtime(ts); if (ptm) { printf(%d-%02d-%02d %02d:%02d:%02d\n, ptm-tm_year 1900, ptm-tm_mon 1, ptm-tm_mday, ptm-tm_hour, ptm-tm_min, ptm-tm_sec); } return 0; } 补充线程安全版本可用localtime_r。三、补充基础知识点1. 主函数传参int main(int argc, char *argv[])argc参数个数包括程序名本身。argv参数字符串数组argv[0]是程序名。代码示例#include stdio.h int main(int argc, char *argv[]) { printf(参数个数: %d\n, argc); for (int i 0; i argc; i) { printf(argv[%d] %s\n, i, argv[i]); } return 0; } // 运行./a.out hello world // 输出argc3, argv[0]./a.out, argv[1]hello, argv[2]world2.const修饰的指针const char *p指向的内容只读不能*p A可以p q。char * const p指针本身是只读可以*p A不能p q。const char * const p内容和指针均只读。 助记const在*左边修饰内容在*右边修饰指针本身。3. 普通文件分类文本文件 (ASCII)按字符编码存储如.c、.txt可以直接用文本编辑器查看。二进制文件按数据的内存原始格式存储如可执行文件、图片、数据库文件。通常读写速度更快占用空间更小。四、多任务并发 —— 进程进程是操作系统资源分配的最小单位拥有独立的 0~4G 虚拟地址空间用户空间栈、堆、数据区、文本区内核空间。1. 进程状态简介R(运行/就绪)正在运行或在队列中等待CPU。S(可中断睡眠)等待事件完成如 I/O 操作可被信号唤醒。D(不可中断睡眠)处理关键 I/O不响应任何信号。T(停止)收到SIGSTOP等信号暂停执行。Z(僵尸)进程已结束但父进程尚未回收其资源wait。X(结束)进程彻底销毁。2. 核心进程函数(1) 创建子进程 (fork)#include unistd.hpid_t fork(void);功能通过复制当前进程创建一个子进程。子进程会拷贝父进程的整个用户空间写时复制技术但不继承 PID。返回值执行一次返回两次。在父进程中返回子进程的 PID(0)在子进程中返回0失败返回 -1。代码示例#include stdio.h #include unistd.h int main() { pid_t pid fork(); if (pid 0) { perror(fork); return 1; } else if (pid 0) { // 子进程代码 printf(子进程: PID %d, 父PID %d\n, getpid(), getppid()); } else { // 父进程代码 printf(父进程: PID %d, 子进程PID %d\n, getpid(), pid); } return 0; } 补充fork()后父子进程的执行顺序由内核调度决定无法预知。(2) 获取进程ID (getpid,getppid)#include unistd.hpid_t getpid(void);// 获取当前进程PIDpid_t getppid(void);// 获取父进程PID(3) 进程退出 (exitvs_exit)#include stdlib.hvoid exit(int status);// C库函数会清理I/O缓冲、调用atexit注册函数#include unistd.hvoid _exit(int status);// 系统调用直接终止不清理代码示例观察缓冲区刷新#include stdio.h #include unistd.h #include stdlib.h int main() { printf(Hello); // 未换行数据在stdout缓冲区 // _exit(0); // 使用 _exit 可能看不到 Hello exit(0); // exit 会刷新缓冲区打印出 Hello return 0; // main 中的 return 等同于 exit }(4) 阻塞回收子进程 (wait)#include sys/wait.hpid_t wait(int *wstatus);功能阻塞父进程直到任意一个子进程结束回收其资源防止僵尸进程。参数wstatus存储子进程退出状态可为NULL。返回值成功返回结束的子进程 PID失败返回 -1。状态检查宏WIFEXITED(status)子进程是否正常退出 (exit/return)。真则用WEXITSTATUS(status)获取退出码 (0-255)。WIFSIGNALED(status)是否被信号杀死。真则用WTERMSIG(status)获取信号编号。代码示例#include stdio.h #include stdlib.h #include unistd.h #include sys/wait.h int main() { pid_t pid fork(); if (pid 0) { // 子进程 printf(子进程运行中...\n); sleep(2); exit(42); // 退出码为42 } else { // 父进程 int status; pid_t ret wait(status); if (ret 0) { if (WIFEXITED(status)) { printf(子进程 %d 正常退出状态码: %d\n, ret, WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf(子进程被信号 %d 终止\n, WTERMSIG(status)); } } } return 0; }(5) 指定回收子进程 (waitpid)#include sys/wait.hpid_t waitpid(pid_t pid, int *status, int options);功能更灵活地回收子进程。参数pid0等待指定 PID 的子进程。0等待与调用进程同一进程组的任意子进程。-1等待任意子进程同wait。-1等待进程组 ID 等于|pid|的任意子进程。options0默认阻塞。WNOHANG非阻塞若无子进程退出则立即返回 0。非阻塞轮询示例#include stdio.h #include unistd.h #include sys/wait.h int main() { pid_t pid fork(); if (pid 0) { sleep(5); return 0; } else { int status; pid_t ret; do { ret waitpid(pid, status, WNOHANG); if (ret 0) { printf(子进程仍在运行父进程可做其他事...\n); sleep(1); } } while (ret 0); if (ret pid) { printf(子进程 %d 已回收\n, pid); } } return 0; }3.exec函数族功能用新的程序镜像完全替换当前进程的文本段。调用成功不返回原程序的后续代码不会执行失败返回 -1。命名规则记忆l(list)命令行参数以arg0, arg1, ..., NULL变长列表传递。v(vector)参数以char* argv[]数组传递。p(path)会从PATH环境变量中搜索可执行文件带p的函数如execlp第一个参数只需给文件名。e(environment)可传递自定义环境变量数组。execl示例 (列表全路径)#include unistd.h #include stdio.h int main() { printf(准备执行 ls...\n); // 格式 execl(路径, 程序名(惯例), 参数1, 参数2, ..., NULL) if (execl(/bin/ls, ls, -l, /home, NULL) -1) { perror(execl); return 1; } // 下面的代码不会被执行 printf(这句话永远不会打印\n); return 0; }execlp示例 (列表仅文件名)#include unistd.h #include stdio.h int main() { printf(执行 date 命令...\n); execlp(date, date, NULL); perror(execlp); return 1; }execv示例 (数组全路径)#include unistd.h #include stdio.h int main() { char *args[] {ls, -l, -a, NULL}; printf(通过 execv 执行 ls...\n); execv(/bin/ls, args); perror(execv); return 1; }execvp示例 (数组文件名)#include unistd.h #include stdio.h int main() { char *args[] {cat, notes.txt, NULL}; execvp(cat, args); perror(execvp); return 1; }⚠️ 注意exec族函数常与fork配合使用。fork创建一个子进程子进程调用exec去执行另一个程序而父进程继续原来的工作。这是 Unix 创建新进程的标准模式。

相关新闻

专科生论文AI降重实战:千笔AI工具解析与应用指南

专科生论文AI降重实战:千笔AI工具解析与应用指南

1. 专科生论文写作的AI困境与解决方案 作为一名经历过专科论文写作的过来人,我深知专科生在学术写作中面临的特殊挑战。与本科生相比,专科生往往接受学术训练的时间更短,写作经验更少,却面临着同样严格的论文审核标准。近年来&…

2026/7/27 8:53:08 阅读更多 →
开源大模型驱动的智能呼叫中心架构与实践

开源大模型驱动的智能呼叫中心架构与实践

1. 项目概述 呼叫中心系统正在经历从传统PBX到AI驱动的智能化转型。开源大模型的出现为这一领域带来了革命性的可能性——我们不再需要依赖昂贵的商业解决方案,就能构建具备自然语言理解、多轮对话和智能路由能力的现代呼叫中心。 这个开源项目将大语言模型与传统C…

2026/7/27 8:53:08 阅读更多 →
AI驱动自建CRM:中小企业替代Salesforce的成本效益分析

AI驱动自建CRM:中小企业替代Salesforce的成本效益分析

这次我们来看一个值得关注的现象:美国小企业正在掀起Salesforce的"退订潮",转而使用AI技术自建软件来大幅压缩成本。这个趋势背后反映的是AI工具成熟度提升和中小企业对成本敏感度的双重变化。对于技术从业者来说,这个现象意味着新…

2026/7/27 8:53:08 阅读更多 →

最新新闻

实在Agent:企业级智能自动化解决方案解析

实在Agent:企业级智能自动化解决方案解析

1. 实在Agent的企业级自动化能力概述 实在Agent作为新一代企业级智能自动化解决方案,其核心价值在于突破了传统RPA(机器人流程自动化)工具的局限性。传统RPA只能执行预设的固定流程,而实在Agent通过融合感知、决策与执行三大能力模…

2026/7/27 9:10:14 阅读更多 →
Engram架构:AI记忆与计算分离的革命性突破

Engram架构:AI记忆与计算分离的革命性突破

1. 从混沌到秩序:Engram架构与AI进化之路 在人工智能领域,我们正见证着一场静默的革命。2026年初,DeepSeek创始人梁文锋团队发表的Engram论文,犹如投入平静湖面的一颗石子,激起了关于AI架构本质的深层思考。这项研究直…

2026/7/27 9:10:14 阅读更多 →
深入解析Linux进程管理:从PCB到状态机

深入解析Linux进程管理:从PCB到状态机

1. 项目概述 Linux进程管理是操作系统最核心的功能之一,也是系统程序员必须掌握的底层知识。作为一名在Linux系统开发领域摸爬滚打多年的工程师,我经常遇到开发者对进程的理解停留在表面——知道fork()能创建新进程,却不清楚内核如何实现&…

2026/7/27 9:10:14 阅读更多 →
基于QtPy (PySide6) 的PLC-HMI工程项目(三)PLC上行数据的准备

基于QtPy (PySide6) 的PLC-HMI工程项目(三)PLC上行数据的准备

本次的通信对象是西门子S7-1500。一、新建数据类型打开博途,新建1500项目,CPU选1513-1PN,新建数据类型,命名为:AreaVar这个命名为AreaVar的数据类型,包含了数据分区(I/QM/DB)、DB编号、数据起点…

2026/7/27 9:10:14 阅读更多 →
全新夸父资源社复活,让大家都能找到想要的资源

全新夸父资源社复活,让大家都能找到想要的资源

夸克网盘已成为当前流行的网盘云存储服务之一,其功能全面,使用体验出色,支持在线解压和阅读,以及快速磁力离线下载,尤其适合IT从业者、学习者存储和检索技术资料、办公素材等内容。接下来,我将介绍几款适配…

2026/7/27 9:10:14 阅读更多 →
AI Agent 面试题 569:多Agent系统中的协作效率评估指标

AI Agent 面试题 569:多Agent系统中的协作效率评估指标

🔥 AI Agent 面试题 569:多Agent系统中的协作效率评估指标摘要:本文深入解析了「多Agent系统中的协作效率评估指标」这一 AI Agent 领域的核心面试题。文章从 群体智能 的基本概念出发,系统性地剖析了 协作效率、评估指标 等关键技…

2026/7/27 9:09:14 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻