Linux——基础IO(上)|语言层面如何访问文件|什么是一切皆文件|C语言文件操作复习|什么是当前路径|系统接口的使用|open|close|write|read|文(上)

简介: 笔记

语言层面如何访问文件


文件=内容+属性(也是数据)


对文件的所有操作,俩种:a.对内容b.对属性


文件在磁盘(硬件)上放着,我们访问文件,先写代码->编译->exe->运行->访问文件:本质是进程在访问文件


进程访问文件时需要通过接口访问的,接口分为语言接口和系统接口


向硬件中写入时,只有操作系统有权利写。当普通用户也想写入的时候,必须让OS提供接口,这个接口是文件类的系统调用接口(这个接口在软件层),系统调用接口使用比语言上的接口要难一些。


语言会对这些系统调用接口封装,让我们用起来更舒服一些,不同的语言有不同的语言级别的文件访问接口(都不一样)。


系统调用接口只有一套,虽然语言封装不一样,但底层使用的系统接口都是一样的。


大多数语言可以跨平台,如果语言不提供对文件的系统接口的封装,那么所有访问文件的操作,都必须使用OS的接口,windows和linux接口就不一样,当使用语言时候,如果要访问文件,一旦使用系统接口编写文件代码,就无法在其它平台运行,所以语言级别的接口要封装,语言会把所有平台的代码都实现一遍,保证跨平台性。


什么是一切皆文件


Linux认为一切皆文件,硬件等设备也是文件。

1.png

显示器:printf/cout->本质是写入output


键盘:scanf/cin->本质是读input


读写都是站在内存的角度。


站在系统的角度,能够被input读取,或者能够output写出的设备就叫文件,文件也包括显示器,键盘,网卡,声卡,显卡,磁盘。几乎所有的外设,都可以称之为文件


C语言文件操作复习


底行模式输入:!man fopen ,可查看使用手册

2.png



sdtio,std:标准,io:input/output


fopen(要打开的文件,打开方式)


mode是一种模式

3.png

w+读写打开,如果文件不存在,文件就先会被创建


w会清空文件再写或创建一个


a/a+:从文件末尾开始写(追加重定向/输出重定向)

4.png

运行程序

5.png

加上\n

6.png

查看,我们发现之前的代码被覆盖掉了

7.png

写入的时候不需要给strlen(s1)加1,不需要给\0保留位置,因为\0结尾是C语言的规定,文件不需要遵守C语言的规定,文件保存的是有效数据,\0不算有效数据,是C语言规定的文件结束的标识符


我们注释掉这些内容

8.png



此时进行查看,log.txt中没有任何内容,也就是我们之前的文件被屏蔽掉了

9.png

这说明以w方式打开文件的时候,先做的不是写入,而是清空


echo+>+内容+文件名,可在文件中写入内容

10.png



如果要清空文件中的内容输入>文件名,即可清空

11.png

以a的方式打开

12.png

13.png


每运行一次,就追加一次内容


读取文件

14.png

15.png



写一个cat命令


16.png

17.png


fopen以w方式打开文件,默认先清空文件(注意:在fwrite之前)


fopen以a打开,追加新内容


C语言会默认打开这三个流


stdout:标准输出流


stdin:标准输入流


stderr:标准错误流

18.png

这三个是文件指针


标准输入:键盘                       标准输出:显示器                      标准错误:显示器


在C语言角度,我们创建的文件是FILE*,这三个流也是FILE*,说明一切皆文件。


什么是当前路径

19.png

当我们把myfile拷贝到上一级目录之后运行,我们发现上一级目录也有log.txt


log.txt是进程创建的


写一个死循环进行观察

20.png



myfile的pid是11174

21.png

我们可以看到这俩个东西

22.png



exe程序在磁盘上所对应的路径


cwd当前进程的工作目录


我们把myfile拷贝到上一级目录,然后运行

23.png

当一个进程运行起来的时候,每个进程都会记录自己当前所处的工作路径


当前路径,进程运行起来时进程所处的工作路径


系统接口的使用


open|close


C语言库函数会调用系统调用接口

24.png



open,打开可能会创建

25.png

pathname:文件路径


flags:选项


open的返回值:成功了返回文件描述符,失败了返回-1

26.png



清空

27.png

打开一个文件必须包含这三个其中一个,只读,只写,读和写

28.png



如何给函数传递标志位

29.png

上面的选项都是宏,对32个比特位进行标记,当作标记位,用整形中不重复的一个bit,就可以标识一种状态

30.png

以ONE|TWO 为例 0000 0001 | 0000 0010=0000 0011


0000 0011 & 0000 0001


0000 0011 & 0000 0010


操作系统传标志位的方案就是这样的


我们尝试打开文件

31.png



删除log.txt之后打开失败,当刚才用C语言的方式打开会帮我们创建文件

32.png

这是因为:在应用层看到的一个很简单的动作,在系统接口层面甚至OS层面,可能要做非常多的动作


如果我们想创建文件,就要添加O_CREATE

33.png34.png

此时打开成功,文件描述符为3

35.png



但此时权限又有点奇怪

36.png

这就要涉及到open的最后一个参数mode,mode是权限参数


37.png


0代表8进制,权限还是有一些不对666代表rw-rw-rw-

38.png

这是我们的系统里有umask,umask会过滤权限

39.png



umask可以人为设置

40.png41.png

此时权限恢复正常

42.png



如果文件已经存在,我们可以使用O_RDONLY

43.png44.png


关闭文件 close,传的是文件标志位


45.png46.png


 


相关文章
|
1月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
53 4
|
6天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
118 78
|
17天前
|
IDE 编译器 开发工具
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
在本文中,我们系统地讲解了常见的 `#pragma` 指令,包括其基本用法、编译器支持情况、示例代码以及与传统方法的对比。`#pragma` 指令是一个强大的工具,可以帮助开发者精细控制编译器的行为,优化代码性能,避免错误,并确保跨平台兼容性。然而,使用这些指令时需要特别注意编译器的支持情况,因为并非所有的 `#pragma` 指令都能在所有编译器中得到支持。
93 41
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
|
10天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
42 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
6天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
50 13
|
12天前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
41 12
|
24天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
83 3
|
23天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
23天前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
49 1
|
1月前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
21 3