嵌入式学习 20(Linux高级编程——文件——misc)

news2024/12/28 3:15:04

 文件操作相关函数

一、symlink 函数

int symlink(const char *oldpath, const char *newpath);

功能:
创建一个指向 oldpath 文件的新的符号链接(软链接)文件。
参数:
• oldpath:被链接指向的原始文件的路径。
• newpath:新创建的符号链接文件的路径。
返回值:
• 成功时,返回 0 。
• 失败时,返回 -1 。

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
    // 以只写方式打开文件"aaa"
    fopen("aaa","w");  
    // 创建一个指向文件"aaa"的符号链接"bbb",并将返回值存储在 link 中
    int link = symlink("./aaa","bbb");  
    // 如果创建符号链接失败(返回值为 -1)
    if( link == -1 )  
    {
        // 向标准错误输出"symlink error"
        fprintf(stderr,"symlink error\n");  
        // 程序返回 1,表示出现错误
        return 1;  
    }
    // 程序正常返回 0
    return 0;
}

二、remove 函数

int remove(const char *pathname);

功能:
删除一个文件。
参数:
pathname:要删除文件的路径。
返回值:
• 成功时,返回 0 。
• 失败时,返回 -1 。

#include <stdio.h>

int main(int argc, const char *argv[])
{
    // 尝试删除文件"./bbb",并将返回值存储在 rm 中
    int rm = remove("./bbb");  
    // 如果删除操作失败(返回值为 -1)
    if ( rm == -1 )  
    {
        // 向标准错误输出"remove error"
        fprintf(stderr,"remove error\n");  
        // 程序返回 1,表示出现错误
        return 1;  
    }
    // 程序正常返回 0
    return 0;
}

三、rename 函数

int rename(const char *oldpath, const char *newpath);

功能:
将一个文件或目录从旧路径重命名为新路径。
参数:
• oldpath:旧路径。
• newpath:新路径。
返回值:
• 成功时,返回 0 。
• 失败时,返回 -1 。

#include <stdio.h>

int main(int argc, const char *argv[])
{
    // 尝试将文件"./aaa"重命名为"bbb",并将返回值存储在 rn 中
    int rn = rename("./aaa", "bbb");  
    // 如果重命名操作失败(返回值为 -1)
    if (rn == -1)  
    {
        // 向标准错误输出"rename error"
        fprintf(stderr, "rename error\n");  
        // 程序返回 1,表示出现错误
        return 1;  
    }
    // 程序正常返回 0
    return 0;
}

四、link 函数

int link(const char *oldpath, const char *newpath);

功能:
创建一个硬链接文件。
参数:
• oldpath:要链接指向的文件。
• newpath:创建的新硬链接文件的路径。
返回值:
• 成功时,返回 0 。
• 失败时,返回 -1 。

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
    // 尝试创建一个指向文件"./bbb"的硬链接"aaa",并将返回值存储在 lk 中
    int lk = link("./bbb", "aaa");  
    // 如果创建硬链接操作失败(返回值为 -1)
    if (lk == -1)  
    {
        // 向标准错误输出"link error"
        fprintf(stderr, "link error");  
        // 程序返回 1,表示出现错误
        return 1;  
    }
    // 程序正常返回 0
    return 0;
}

五、truncate 函数

int truncate(const char *path, off_t length);

功能:
将指定文件的大小截断为指定的长度。
参数:
• path:要截断的文件的路径。
• length:要截断到的长度。
返回值:
• 成功时,返回 0 。
• 失败时,返回 -1 。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, const char *argv[])
{
    // 尝试将文件"./aaa"截断为 1024 * 1024 * 1024 字节大小,并将返回值存储在 tc 中
    int tc = truncate("./aaa", 1024 * 1024 * 1024);  
    // 如果截断操作失败(返回值为 -1)
    if (tc == -1)  
    {
        // 向标准错误输出"truncate error"
        fprintf(stderr, "truncate error\n");  
        // 程序返回 1,表示出现错误
        return 1;  
    }
    // 程序正常返回 0
    return 0;  
}

错误处理相关函数

六、perror 函数

void perror(const char *s);

功能:
打印指定的字符串和与当前 errno 值对应的错误信息到标准错误输出。
参数:
s:要在错误信息前打印的字符串。
返回值:
无。

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
    // 以只读方式打开文件"aaa",并将文件指针存储在 fp 中
    FILE * fp = fopen("aaa","r");  
    // 如果文件打开失败,文件指针为 NULL
    if ( fp == NULL )  
    {
        // 向标准错误输出"fopen errro"
        fprintf(stderr,"fopen errro\n");  
        // 调用 perror 函数输出与当前 errno 对应的错误描述
        perror("fopen");  
        // 程序返回 1,表示出现错误
        return 1;  
    }
    // 程序正常返回 0
    return 0;  
}

七、strerror 函数

char *strerror(int errnum);

功能:
根据给定的错误码返回对应的错误信息字符串。
参数:
errnum:错误码。
返回值:
成功时返回对应的错误信息字符串。

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
    int i;
    // 从 0 到 134 进行循环
    for (i = 0; i < 135; i++) 
    {
        // 打印当前的数字 i 以及对应的错误描述字符串
        printf("%d: %s\n", i, strerror(i));  
    }
    // 程序正常返回 0
    return 0;
}

八、error 函数

void error(int status, int errnum, const char *format,...);

功能:
程序出错时打印对应的出错原因、用户输入的字符串并退出。
参数:
• status:程序退出的状态,如 EXIT_FAILURE(1)或 EXIT_SUCCESS(0)。
• errnum:错误码。
• format:类似 printf 的格式化字符串。
返回值:
无。
C 内置宏
• __FILE__:表示当前源文件的文件名。
• __LINE__:表示当前代码所在的行号。
• __func__:表示当前所在的函数名。
• __DATE__:表示编译日期,格式为 "Mmm dd yyyy"。
• __TIME__:表示编译时间,格式为 "hh:mm:ss"。

#include <stdio.h>
#include <error.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, const char *argv[])
{
    // 尝试以只读方式打开文件 "aaa",并将文件指针存储在 fp 中
    FILE * fp = fopen("aaa", "r");
    // 如果文件打开失败,文件指针为 NULL
    if (fp == NULL)
    {
        // 使用 error 函数打印错误信息并退出程序
        // 1 表示退出状态为 1(失败)
        // errno 表示获取当前的错误码
        // 后面的参数是自定义的错误描述,包含了文件名、行号、函数名、日期和时间等信息
        error(1, errno, "fopen,file:%s line:%d func:%s date:%s time:%s\n",
              __FILE__, __LINE__, __func__, __DATE__, __TIME__);
        return 1;
    }

    return 0;
}

Makefile    工程管理工具

Makefile 是一种工程管理工具,具有以下特点和作用:
1. 定义规则
◦ 描述了项目中文件之间的依赖关系和生成这些文件的命令。
2. 自动化编译
◦ 当您修改了某些源文件后,Makefile 能够自动确定哪些文件需要重新编译,并执行相应的编译命令,提高开发效率。
3. 灵活配置
◦ 可以方便地设置编译器选项、链接库、包含路径等各种编译和链接参数。
4. 目标管理
◦ 您可以定义不同的目标,例如编译、清理、安装等,通过指定不同的目标来执行不同的操作序列。
5. 跨平台
◦ 其语法相对简单且具有一定的通用性,在不同的操作系统和开发环境中都能使用。
例如,一个简单的 Makefile 可能包含规则,说明如何从源文件生成目标文件,以及如何将目标文件链接成可执行文件。当您运行 make 命令时,它会按照规则进行相应的操作。

比如我要编写三个.c文件,我的Makefile可以这么写:

SRC = main.c  # 定义变量 SRC 并初始化为 main.c
SRC += add.c  # 向 SRC 变量添加 add.c
SRC += mul.c  # 向 SRC 变量继续添加 mul.c
OBJ = all  # 定义变量 OBJ 为 all

# 自定义变量
FALG = -g  # 定义编译调试标志变量为 -g
LIB = -lm  # 定义链接数学库的变量为 -lm
CC = gcc  # 定义编译器为 gcc

$(OBJ):$(SRC)  # 定义目标 all 依赖于 SRC 变量所包含的源文件
    $(CC) $(SRC) -o $(OBJ) $(FALG) $(LIB)  # 当 all 目标需要更新时,执行的编译和链接命令

clean:  # 定义名为 clean 的目标,用于清理操作
    rm $(OBJ)  # 执行删除 all 目标文件的操作

这个 Makefile 定义了源文件列表 SRC(包含 main.c、add.c 和 mul.c)和目标文件 OBJ(为 all)。通过自定义变量设置了编译选项 FALG(调试标志)、链接库 LIB(数学库)和编译器 CC(gcc)。
主要目标 all 依赖于源文件,当执行 make all 时,会使用指定的编译器、编译选项和链接库将源文件编译并链接为目标文件 all。
clean 目标用于清理生成的目标文件 all,执行 make clean 时会删除它。

gdb 调试器

gdb (GNU Debugger)是用于调试程序的工具。
• 特点:
◦ 断点设置:可以在代码的特定位置设置断点,使程序在运行到该点时暂停。
◦ 变量查看和修改:能够查看程序运行时变量的值,并在需要时进行修改。
◦ 单步调试:支持逐行执行代码,观察程序的执行流程和状态。
• 用途:
◦ 查找和修复程序中的逻辑错误和运行时错误。
◦ 理解程序的执行过程,优化程序的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring事务失效问题可以这样解决

今天咱们就来聊聊在Spring事务管理中你可能踩过的坑&#xff0c;并教你如何规避这些陷阱。 事务提交的陷阱 有时&#xff0c;事务方法在抛出异常后没有回滚&#xff0c;而是被提交了。 这通常是由于异常被捕获但没有显式抛出&#xff0c;导致Spring误以为事务正常完成。 错…

Review Learning : 推进一体化超高清图像恢复训练方法

Review Learning: Advancing All-in-One Ultra-High-Definition Image Restoration Training Method 摘要 一体化图像恢复任务变得越来越重要&#xff0c;特别是对于超高清&#xff08;UHD&#xff09;图像。 现有的一体机UHD图像恢复方法通常通过引入针对不同退化类型的即时…

小区团购管理

TOC springboot254小区团购管理 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&…

一文搞懂后端面试之数据库综合应用【中间件 | 数据库 | MySQL | 高可用 | 高性能】

查询缓存 在MySQL里面&#xff0c;允许用户开启查询缓存。你可以理解这个缓存就是用SQL作为键&#xff0c;而对应的查询结果集就是值。如果下次过来的还是同一个查询&#xff0c;那么就直接返回缓存起来的查询结果集。 但是查询缓存不一定带来查询性能提升。如果你的查询每一…

接口隔离原则

接口隔离原则 接口隔离原则就是客户端不应该依赖它不需要的接口&#xff0c;或者说类间的依赖关系应该建立在最小的接口上。 我们以搜索美女为例&#xff0c;设计了如下的类图&#xff1a; 源代码如下。美女及其实现类&#xff1a; 搜索程序及其子类源代码如下&#xff1a; 最…

0101中文乱码-BufferedImage-图片处理

文章目录 1、问题描述2 、电子证书生成3、中文乱码原因及修复4、思考 结语 1、问题描述 接手维护一个休闲赛事类项目&#xff0c;因为服务器到期&#xff0c;项目从云服务器迁移到本地服务器。 项目生成比赛&#xff0c;分为二人组、三人组等等的团体&#xff1b;比赛设置几个…

判断矩阵中的一致性检验是指什么

判断矩阵中的一致性检验通常指的是在层次分析法&#xff08;Analytic Hierarchy Process, AHP&#xff09;中&#xff0c;用于评估决策者在构造判断矩阵时的逻辑一致性。 在AHP中&#xff0c;决策者需要比较成对的因素&#xff0c;并为每对因素的相对重要性赋予一个数值&#…

什么是haproxy七层代理

一.负载均衡 1.1.什么是负载均衡 负载均衡&#xff1a;Load Balance&#xff0c;简称LB&#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均 衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备&#xff0c;从…

DriftingBlues2靶机渗透测试

DriftingBlues2靶机 文章目录 DriftingBlues2靶机信息收集FTP渗透web渗透权限提升靶机总结 信息收集 nmap扫描得到21,22和80端口&#xff0c;其中21ftp协议可以使用匿名用户登录 使用目录扫描一下网站&#xff0c;得到了blog目录 FTP渗透 匿名用户登录进去&#xff0c;发现…

QT移除窗体的最大化和最小化按钮

效果 代码位置 代码 int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.setWindowFlags(w.windowFlags() & ~Qt::WindowMaximizeButtonHint & ~Qt::WindowMinimizeButtonHint);w.show();return a.exec(); }

考研数学想考120,把李林880做到准确率80%以上够吗?

考研数学想考120&#xff0c;把880题做到正确率80%以上是不够的 因为最近几年的考研数学变化&#xff0c;很大&#xff0c;传统的背题型的备考方式已经没用了&#xff0c;而880题是这种模式的佼佼者&#xff0c;25版的880变动又很小&#xff0c;只加了40道比较综合的题目在每一…

python基础命令学习

1.Python基础知识 目录 1.Python基础知识1.1 变量及类型1.2 标识符与关键字1.3 输出与输入1.3.1格式化符号1.3.2转义字符1.3.3结束符1.3.4输入的特点 1.4 运算符1.4.1 算数运算符1.4.2 赋值运算符1.4.3 比较(即关系)运算符1.4.4 逻辑运算符 1.5 数据类型转换1.6 判断与循环语句…

【K8S系列】Kubernetes基础介绍

一、前言 搭建完k8s集群后&#xff0c;正式进入k8s相关知识点的理论了解。并结合官方文档逐步总结涉及k8s各类知识点&#xff0c;希望能对正在学习的或将要学习得到小伙伴有所帮助。 二、系统部署历程回顾 传统部署时代&#xff1a; 早期&#xff0c;各个组织是在物理服务器…

[python]uiautomation.WindowControl函数用法

Python UIAutomation 窗口控件 介绍 在本文中&#xff0c;我们将探讨Python UIAutomation库以及如何使用它来控制和自动化Windows应用程序。我们将介绍UIAutomation的基础知识及其功能&#xff0c;并提供代码示例来演示其用法。 什么是UI自动化&#xff1f; UIAutomation是一个…

Java中常用的设计模式

一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程…

【机器学习】探索数据矿藏:Python中的AI大模型与数据挖掘创新实践

&#x1f496; 前言&#xff1a;探索数据矿藏1. &#x1f4ca;数据获取与预处理&#xff1a;AI大模型的燃料1.1 &#x1f310;数据获取&#xff1a;多样性与规模并重1.2 &#x1f9f9;数据清洗与处理&#xff1a;提升数据质量1.3 &#x1f50d;特征工程&#xff1a;挖掘数据的深…

稠密检索的规模艺术:模型、数据与性能的精准匹配

论文&#xff1a;https://arxiv.org/pdf/2403.18684代码&#xff1a;GitHub - jingtaozhan/DRScale机构&#xff1a;清华大学领域&#xff1a;稠密检索、Scaling Laws发表&#xff1a;SIGIR2024最佳论文 Abstract Scaling Laws已经在广泛的任务中被观察到&#xff0c;特别是在…

JavaScript基础——闭包

闭包简介 闭包的作用 闭包可以保留变量的状态 闭包可以让变量私有化 闭包的缺点 闭包简介 在JavaScript中&#xff0c;重复声明同一个变量会导致变量冲突&#xff0c;在这个时候可以使用闭包创建独立的执行环境。 在JavaScript中&#xff0c;闭包是指封闭的执行环境&#xff…

“论软件开发过程RUP及其应用”写作框架,软考高级,系统架构设计师

论文真题 RUP&#xff08;Rational Unified Process&#xff09;是IBM公司的一款软件开发过程产品&#xff0c;它提出了一整套以UML为基础的开发准则&#xff0c;用以指导软件开发人员以UML为基础进行软件开发。RUP汲取了各种面向对象分析与设计方法的精华&#xff0c;提供了一…

Wireshark显示过滤器常用关键字及过滤表达式

Wireshark显示过滤器常用关键字及过滤表达式 1. 过滤器类型 Wireshark抓包工具提供了两种类型过滤器&#xff1a;抓包过滤器 和 显示过滤器。 抓包过滤器&#xff1a; 抓取满足过滤条件的数据包&#xff0c;不满足过滤条件的数据包不会被抓取。 显示过滤器&#xff1a; 包已…