【Linux】Linux文件

linux文件系统和操作方法

Linux文件系统的结构如下:

【Linux】Linux文件

root: 这是系统管理员(也称为超级管理员)的用户主目录。bin: 这是Binary的缩写,存放最常用的命令。boot: 这里存放启动Linux时使用的核心文件,包括一些连接文件和镜像文件。dev: 这是Device(设备)的缩写,存放Linux的外部设备。Linux中访问设备的方式与访问文件的方式相同。etc: 存放所有配置文件和系统管理所需的配置文件和子目录。home: 用户的主目录,每个用户在Linux系统中都有一个以用户账号命名的目录。var: 存放不断变化的文件数据,通常将经常被修改的目录放在这里,包括各种日志文件。lib: 存放系统最基本的动态链接共享库,类似于Windows中的DLL文件,几乎所有应用程序都会用到这些共享库。usr: 存放系统用户工具和程序,包括:bin: 用户命令sbin: 超级用户使用的管理程序和系统守护程序include: 标准头文件lib: 库文件src: 内核源代码tmp: 用于存放临时文件。media: Linux系统会自动识别一些设备,如U盘、光驱等,并将这些设备挂载到这个目录下。mnt: 用于临时挂载其他文件系统。proc: 包含进程的相关信息。

Linux文件操作方式主要通过文件描述符(fd)进行底层文件操作(系统调用)以及使用I/O库函数。

Linux底层文件操作(关于文件的系统调用)

write函数的使用:

成功:返回实际写入的字节数
失败:返回-1,并设置错误号errno,可使用strerror(errno)查看错误信息
注意:从文件当前指针位置开始写入,文件刚打开时指针指向文件头。

示例:

#include #include #include #include int main(void) {    char buff[] = "hello world\n";    //1 2 都是输出到控制台    int len = 0;    len = write(1, buff, sizeof(buff)); //标准输出    if (len != -1) {        printf("写入成功,写入的字节数为:%d\n", len);    } else {        printf("写入失败,错误信息为:%s\n", strerror(errno));    }    return 0;}

【Linux】Linux文件

read函数的使用:

返回值大于0——实际读取的字节数
返回值为0——已读到文件尾
返回值为-1——出错
注意:参数3表示最多能接受的字节数,而不是指一定要输入的字节数。

示例:

char buffer[1024];int cnt = read(0, buffer, sizeof(buffer)); //从标准输入读if (cnt > 0) {    buffer[cnt] = '\0'; //确保字符串以空字符结尾    printf("读取成功,读取的字节数为:%d,内容为:%s\n", cnt, buffer);} else if (cnt == 0) {    printf("已读到文件尾\n");} else {    printf("读取失败,错误信息为:%s\n", strerror(errno));}

open函数的使用:

int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);

成功:返回文件描述符
失败:返回-1
打开方式:

O_RDONLY:只读O_WRONLY:只写O_RDWR:读写O_CREAT:如果文件不存在,则创建该文件,并使用第三个参数设置权限;如果文件存在,则只打开文件。O_EXCL:如果同时使用O_CREAT且文件已存在,则返回错误,用于防止多个进程同时创建同一个文件。O_APPEND:尾部追加方式(打开后,文件指针指向文件的末尾)。O_TRUNC:若文件存在,则长度被截为0,属性不变。

第三个参数:设置权限(略)

巧文书 巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

巧文书 61 查看详情 巧文书

注意:返回的文件描述符是该进程未打开的最小的文件描述符。

示例:

#include #include #include #include #include #include #include #include #define FILE_RW_LEN 1024int main(void) {    //第二个参数-文件存在则无法打开    //O_APPEND —— 追加    int fd = open("./test_open.txt", O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);    int count = 0;    char buffer[FILE_RW_LEN] = "hello i am test";    if (fd != -1) {        count = write(fd, buffer, strlen(buffer));        if (count != -1) {            printf("写入成功,写入的字节数为:%d\n", count);        } else {            printf("写入失败,错误信息为:%s\n", strerror(errno));        }        close(fd);    } else {        printf("打开文件失败,错误信息为:%s\n", strerror(errno));    }    return 0;}

【Linux】Linux文件

close函数的使用:

int close(int fd);

成功:返回0
失败:返回-1

示例:

#include #include #include #include #include #include #include #include #define FILE1_NAME "file1.txt"#define FILE2_NAME "file2.txt"int main(void) {    int file1, file2;    char buffer[4096];    int len = 0;    file1 = open(FILE1_NAME, O_RDONLY);    if (file1 != -1) {        file2 = open(FILE2_NAME, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);        if (file2 != -1) {            while ((len = read(file1, buffer, sizeof(buffer))) > 0) {                write(file2, buffer, len);            }            close(file2); //实战记得判断是否关闭成功        } else {            printf("无法打开文件%s,错误信息为:%s\n", FILE2_NAME, strerror(errno));        }        close(file1);    } else {        printf("无法打开文件%s,错误信息为:%s\n", FILE1_NAME, strerror(errno));    }    return 0;}

观察耗时:
time xxx 程序总的执行时间
程序本身所消耗的时间
系统调用所消耗的时间

【Linux】Linux文件

lseek函数的使用:

off_t lseek(int fd, off_t offset, int whence);

成功:返回新的文件位置与文件头之间的偏移
失败:返回-1

示例:从一个文件偏移100处,拷贝100字节到另一个文件。

#include #include #include #include #include #include #include #include #define FILE1_NAME "lseek_test.c"#define FILE2_NAME "lseek_test2.txt"#define SIZE 100int main(void) {    int file1, file2;    char buffer[1024];    int ret;    file1 = open(FILE1_NAME, O_RDONLY);    if (file1 != -1) {        file2 = open(FILE2_NAME, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);        if (file2 != -1) {            lseek(file1, 100, SEEK_SET); // 移动文件指针到偏移100处            ret = read(file1, buffer, SIZE); // 读取100字节            if (ret > 0) {                buffer[ret] = '\0';                write(file2, buffer, SIZE);            }            close(file1);            close(file2);        } else {            printf("无法打开文件%s,错误信息为:%s\n", FILE2_NAME, strerror(errno));        }    } else {        printf("无法打开文件%s,错误信息为:%s\n", FILE1_NAME, strerror(errno));    }    return 0;}

ioctl函数的使用(嵌入式相关):

int ioctl(int fd, int cmd, [int *argdx, int argcx]);

fd是用户程序打开设备时使用open函数返回的文件标识符,cmd是用户程序对设备的控制命令,后面是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。

以上就是【Linux】Linux文件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/510479.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 00:25:37
下一篇 2025年11月9日 00:26:42

相关推荐

  • Golang 程序保护:编译后的安全性与应对策略

    本文探讨了 Golang 程序编译后源代码的安全性问题,并指出没有任何方法可以完全防止逆向工程。文章分析了潜在风险,并建议开发者将重点放在商业模式创新上,而非单纯依赖代码保护。同时,也提醒开发者不必过分担忧,因为绝大多数用户并不具备逆向工程能力。 Golang 编译后的安全性分析 在软件开发领域,保…

    好文分享 2025年12月16日
    000
  • Go语言中中断time.Sleep的优雅方法

    在go语言中,`time.sleep`是一个阻塞操作,无法直接中断。本文将详细介绍如何利用go的并发原语——通道(channels)和`select`语句,来实现非阻塞式的等待和协调不同goroutine的执行。通过这种方法,我们可以优雅地处理超时、外部事件信号以及goroutine间的同步,从而避…

    2025年12月16日
    000
  • Go语言移植C语言MWC随机数生成器:正确处理64位中间计算

    本文深入探讨了将C语言Multiply-with-carry (MWC) 随机数生成器移植到Go语言时遇到的常见问题。核心在于C语言实现中利用uint64_t进行中间计算以精确提取进位,而Go语言初次移植时若未能匹配这一类型宽度,将导致随机数序列不一致。教程将详细分析C语言原理,指出Go语言移植的常…

    2025年12月16日
    000
  • 使用反射进行JSON反序列化:解决Unmarshal到反射值的问题

    本文旨在解决在使用Go语言的`encoding/json`包进行JSON反序列化时,遇到的“Unmarshal on reflected value”问题。通过示例代码,详细解释了如何正确地使用反射来动态地创建和填充对象,从而实现将JSON数据反序列化到指定类型的对象中。 在使用Go语言的encod…

    2025年12月16日
    000
  • Go语言反射:动态获取结构体字段值与类型转换实践

    本教程深入探讨如何在go语言中使用反射机制,通过字段名称字符串动态访问结构体内部字段。重点介绍当通过反射获取到`reflect.value`类型时,特别是针对切片类型字段,如何利用`value.interface()`方法结合类型断言将其转换为具体的go类型,从而实现直接的数据操作和遍历,避免持续使…

    2025年12月16日
    000
  • Golang如何实现字符串拼接与格式化

    Go中字符串拼接推荐使用+(少量)、strings.Join(切片)、fmt.Sprintf(格式化)和strings.Builder(高性能循环拼接)。2. 格式化常用fmt.Sprintf等函数,支持%v、%s、%d、%f、%q、%+v、%#v等动词输出不同类型。3. 性能上strings.Bu…

    2025年12月16日
    000
  • 前端资源异步加载与性能优化

    异步加载通过非阻塞方式提升页面性能。使用 async、defer 和动态脚本实现 JS 异步加载;内联关键 CSS、异步加载非关键样式优化 CSS;图片采用 lazy loading 与响应式加载;结合 preload、prefetch 提升资源优先级,合理运用可显著优化首屏渲染与用户体验。 前端资…

    2025年12月16日
    000
  • 如何在Golang中发布自定义模块

    发布Go模块需先创建go.mod文件并设置正确模块名,如go mod init github.com/your-username/your-module-name;接着编写首字母大写的可导出函数或类型;然后将代码推送到GitHub仓库;之后打语义化版本标签,如git tag v1.0.0并推送;最后…

    2025年12月16日
    000
  • 如何在Golang中实现错误重试机制

    使用for循环配合计数器和time.Sleep实现Go语言中的错误重试机制,适用于网络请求等不稳定场景。 在Go语言中实现错误重试机制,核心是通过循环、延迟和退出条件控制,在操作失败后自动重试,直到成功或达到最大尝试次数。这种机制常用于网络请求、数据库连接、API调用等不稳定的外部依赖场景。 使用简…

    2025年12月16日
    000
  • Go语言中高效管理并发外部命令执行:构建Goroutine工作池

    本文探讨了在go语言中高效管理并发外部命令执行的策略,特别是如何避免因大量goroutine同时启动而导致的资源耗尽和程序过早退出。通过构建一个基于通道(channel)和`sync.waitgroup`的goroutine工作池,我们可以精确控制并行执行的外部进程数量,实现任务的动态调度和资源的优…

    2025年12月16日
    000
  • Go语言中JSON整数键的解码与高效转换实践

    本文深入探讨了go语言`encoding/json`包在处理json对象时,为何其键必须为字符串类型,以及当json数据包含数字作为键时,如何高效地将其解码并转换为`map[int]t`类型。文章将提供详细的解释和实用的go代码示例,帮助开发者理解并实现这一转换过程,确保数据处理的准确性和内存效率。…

    2025年12月16日
    000
  • Golang 模板解析失败:空白页问题分析与解决

    本文旨在解决 Golang 模板解析时出现空白页的问题。通过分析 `template.ParseFiles` 和 `template.New` 的差异,解释了模板名称不匹配导致的问题,并提供了两种解决方案:一是确保模板名称与文件名一致,二是使用 `ExecuteTemplate` 显式指定要执行的模…

    2025年12月16日
    000
  • 如何在Golang中实现DevOps监控报警

    集成Prometheus暴露指标,使用OpenTelemetry实现链路追踪,通过Alertmanager或Webhook对接告警通知,结合Zap日志与Loki实现日志监控联动,构建Golang服务可观测性闭环。 在Golang中实现DevOps监控报警,核心是将应用运行状态数据采集、上报,并与告警…

    2025年12月16日
    000
  • Golang模板解析空白页问题详解与解决方案

    本文旨在解决Golang模板解析时出现空白页的问题。通过分析`template.ParseFiles`和`template.New`的使用差异,揭示问题根源在于模板命名不匹配。提供两种解决方案:一是使用与文件名相同的模板名,二是使用`ExecuteTemplate`显式指定要执行的模板,帮助开发者避…

    2025年12月16日
    000
  • 在Gorilla Mux中创建带可选URL变量的路由

    本文详细介绍了如何在go语言的gorilla mux路由框架中实现带有可选url变量的路由。核心策略是为同一处理函数注册多个路由模式,一个包含变量,另一个不包含。在处理函数内部,通过检查`mux.vars`返回的变量是否存在来适配不同的请求路径,从而优雅地处理有无特定参数的场景,确保路由的灵活性和代…

    2025年12月16日
    000
  • Go语言中优雅地中断并发任务:使用通道和Select实现精确控制

    在go语言中,直接中断一个正在执行的`time.sleep`操作并非易事,因为`time.sleep`会阻塞当前goroutine。本文将深入探讨如何避免使用阻塞的`time.sleep`进行并发控制,转而利用go的通道(channels)和`select`语句,实现goroutine间的安全通信与…

    2025年12月16日
    000
  • Go语言defer机制深度解析:能否获取其函数引用?

    go语言的`defer`机制用于资源清理,其内部调用列表是运行时实现细节,不提供直接访问。本文探讨了获取`defer`函数引用的可行性,强调了go语言不鼓励此类操作,并提供了安全的惯用模式来管理初始化和清理逻辑。尽管存在通过`cgo`和`unsafe`进行底层探索的示例,但强烈建议避免在生产环境中使…

    2025年12月16日
    000
  • 使用 Go 语言进行原始套接字编程

    本文旨在指导开发者如何使用 Go 语言进行原始套接字编程,以实现自定义网络数据包的发送和接收。重点介绍使用 go.net/ipv4 库创建和操作原始套接字,以及如何构造自定义 IP 头部来实现源 IP 地址欺骗等高级网络功能。同时,也强调了使用原始套接字的安全风险和权限要求。 在某些网络编程场景下,…

    2025年12月16日
    000
  • Go与Fish Shell集成指南:正确设置GOPATH以避免包导入错误

    本文详细阐述了在fish shell环境下配置go开发环境时,`go install`命令可能遇到的“包找不到”错误。核心问题在于`gopath`环境变量未正确导出。教程提供了正确的配置方法,强调了在`config.fish`中使用`set -x`命令导出`gopath`的重要性,确保go工具链能正…

    2025年12月16日
    000
  • 深入理解Go语言的defer机制:原理、限制与替代方案

    go语言的`defer`语句用于安排函数在当前函数返回前执行,其内部实现与特定运行时(如goroutine和栈帧)紧密关联,因此无法通过标准go语言可靠地获取或直接调用已延迟的函数引用。尽管通过cgo和`unsafe`包存在低级访问的可能性,但这被强烈不推荐。对于需要共享资源清理逻辑的场景,go语言…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信