Linux基础 IO操作

article/2025/10/5 14:29:07

一、IO接口的基本认识与使用

在c语言中,我们对文件用fopen,fread,fwrite,fclose等等c语言标准库函数来进行操作,实际上这些库函数是对系统调用接口的一个封装,目的是操作简单,方便编程。

以下介绍的是纯粹的系统调用接口来实现一些基础操作。

1.open() 函数

函数原型:
int open (const char* pathname,int flag);
int open (const char* pathname,int flag,mode_t mode);

          pathname: 要打开的文件路径名

          flag: 文件的打开方式

                必选项: 
                O_RDONLY---->只读打开 
                O_WRONLY---->只写打开   
                O_RDWR---->读写打开

                可选项:
                O_CREAT:文件不存在,则创建
                O_TRUNC:截断文件—丢弃原有数据        
                O_APPEND:追加写入
例子:w+ 在c语言中表示为 可读可写,文件不存在是创建文件,文件存在时截断内容为0 
     等价于O_RDWR|O_CREAT|O_TRUNC
         
          mode: 打开文件的权限
                当0_CREATE存在时,就一定要设置第三个参数 mode

例子:open("./text.txt",O_RDWR|O_CREAT|O_TRUNC,0664)
      在参数mode中,0664中的0不能被省略,涉及到特殊权限位

返回值:成功则返回一个文件描述符(非负整数)作为文件操作句柄,失败返回-1

2.write()函数

函数原型: write(int fd,void char *buf,size_t len);

                   fd: open打开文件时候,返回的操作句柄----文件描述符

                   buf: 要写入文件数据空间的首地址(将buf指向的内容写入文件中)

                   len: 写入文件的字节数

返回值:成功返回写入文件的字节数,失败返回-1

3.read()函数

函数原型:ssize_t read(int fd,char *buf,size_t len);

                  fd: open打开文件时候,返回的操作句柄----文件描述符

                  buf: 一块空间的首地址,用于存放从文件中读取的数据

                  len: 读取的字节数 (len不能大于buf空间的大小)4.

4.lseek()函数

函数原型:off_t lseek(int fd,off_t offset,int whence);

                  fd: open打开文件时候,返回的操作句柄----文件描述符

                  offset: 偏移量

                  whence: 将文件流指针偏移到什么位置

                                 SEEK_SET:  相对于文件开始位置偏移

                                 SEEK_CUR:  相对于文件当前位置偏移

                                 SEEK_END:  相对于文件结尾位置偏移

返回值:跳转后,读写位置相对于文件起始位置的偏移量

              失败返回-1

5.close()函数

函数原型:int close(int fd);

简单代码实现:

 运行结果:

二、文件描述符 

通过上面的一些系统调用接口,我们知道文件描述符是一个非负整数,我们知道在Linux下,一切皆可以看成文件,Linux中规定每一个文件对应一个索引(相当于数组的下标)在对这些文件进行操作的时候,就通过索引就可以直接找到文件进行操作,而文件描述符就是内核为了高效管理这些已经打开的文件而创建的索引。

我们知道在Linux下,0代表标准输入,1代表标准输出,2代表标准错误。在程序刚刚启动的时候,会默认打开3个文件描述符,分别是标准输入0,标准输出1,标准错误2,也就是说在此之后,新创建的文件,它的文件描述符为3,继续创建文件,文件描述符为4,以此类推。

当打开一个文件时,内核会在文件描述符表中寻找一个空闲且最小的文件描述符(下标最小的位置)

Linux内核对这些已经打开的文件创建一个文件描述表来进行管理,如下图:

 注意:同一个文件可以被多次打开,但是每打开一次都需要一个新的文件描述符,这就说明同一个进程的不同文描述符可以指向同一个文件。

三、重定向

1.基本概念

把原本要写入A文件的数据,在不改变程序逻辑的情况下,写入到B文件

具体符号表示:

>   清空重定向

ls >test.txt      将ls的结果输出到文件test.txt中

解释:ls 默认把浏览结果输出到屏幕(就是将数据写入标准输出),加重定向符号>后,数据的流向改变,数据将不在写入标准输出,而是写入文件test.txt中,所以文件test.txt中会写入ls的结果

>>  追加重定向

符号>>和>的区别:重定向符号>,是将原文件中的内容先清空,后将数据写入;而重定向符号>>是直接将数据写入

重定向原理:

通过改变文件描述符对应的文件描述信息(struct file结构体),来改变所操作的文件,实现数据流向的改变。 

 接口:int dup2(int oldfd,newfd);

功能:让newfd对应的位置保存oldfd对应位置的信息,相当于把newfd重定向到oldfd

(如果newfd本身已经打开了一个文件,则重定向前,会将对应的文件先关闭释放掉)

简单代码实现:

 

 运行结果:


http://chatgpt.dhexx.cn/article/D8wGafX1.shtml

相关文章

Java中的IO操作

IO 操作是我以前不太理解的操作。总是觉得很神奇,然后一脸懵逼。今天终于鼓起勇气,认真的学习IO方面的知识。有理解不妥当或者不正确的地方,还请各位大佬指正。 一、java的io发生在哪? 这个问题,我们必须首先明确下。…

基础IO-文件IO操作

目录 1.C语言文件IO相关操作(库函数IO接口) 2. 系统调用IO接口 1.C语言文件IO相关操作(库函数IO接口) fopen--打开文件,返回一个文件的操作句柄,有了句柄才能对指定的文件进行操作。 FILE *fopen(char *p…

Java文件IO操作

目录 一、了解什么是文件 狭义的文件: 广义的文件: 二、文件的路径 ①文件的绝对路径 ②文件的相对路径 三、Java对于文件的操作 File类的构造方法 File类的普通方法 四、对于文件的内容操作 ①FileInputStream(文件输入流&#xf…

IO操作

一、简介 IO流是用来处理设备之间的数据传输的,数据一般储存在设备上 设备:硬盘,光盘,内存等等,内存是临时储存的 Java对数据的操作是采用流的方式 按照操作的数据分为:字节流和字符流 暗照流向&#x…

Java基础--IO操作

一、IO原理及分类 一、IO原理 1、I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输,如读写文件,网络通信等。 2、java程序中对于数据的输入/输出操作一般都是以流的方式进行 3、java.io包下提供各…

关于I/O操作

https://blog.csdn.net/deram_boy/article/details/51191425 提及这个,就想到了各种文件操作,这种流,什么reader 啊, writer啊,buffer啊,file啊。但是综合的东西与总结,只是曾经了解。因为工作…

IO操作概念

IO:输入输出,对程序的输入与输出 文件:一组有关数据的集合 文件名:这组数据的名字 linux系统中所有文件均属于文件(通过文件系统进行管理) 按类型分类: 1、普通文件 (…

I/O操作

前言 I/O操作即操作存储器,所以想了解I/O操作,需要了解一点存储器相关知识点。 计算机存储器 存储器是计算机的核心部件之一,在完全理想的状态下,存储器应该要同时具备以下三种特性: (1)速度…

操作系统_04_IO相关(个人总结)

声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识 内容详细全面, 言辞官方的文章 2. 由于是个人总结, 所以用最精简的话语来写文章 3. 若有错误不当之处, 请指出 软硬链接 软链接(快捷方式): 删除原文件时, 软链接则失效 硬链接…

gcc 命令

gcc 命令 GCC 编译器 gcc 命令格式 gcc 选项 文件名字主要选项 -c&#xff1a; 只编译不链接为可执行文件&#xff0c;编译器将输入的.c 文件编译为.o 的目标文件。-o&#xff1a; <输出文件名>用来指定编译结束以后的输出文件名&#xff0c;如果不使用这个选项的话 G…

Ubuntu Linux gcc的常用命令

目录 一、gcc简介 二、简单的gcc编译 1 预处理 2 编译为汇编语言代码 3 汇编 4 连接 三、多个程序文件的编译 四、检查错误 五、连接库文件 1 编译成可执行文件 2 链接 3 强制链接时使用静态链接库 六、总结 一、gcc简介 Linux系统下的Gcc&#xff08;GNU C Compi…

Linux GCC 编译详解

文章目录 一、GCC 编译器简介二、GCC 工作流编程语言的发展GCC 工作流程gcc 和 g 的区别 三、使用 GCC 编译GCC 编译格式GCC 编译流程多个源文件编译 一、GCC 编译器简介 首先&#xff0c;什么是编译器呢&#xff1f; 我们可以使用编辑器&#xff08;如 linux 下的 vi、window…

gcc编译命令的常用选项——强烈推荐大家使用 -Wall 选项

C程序编编译的过程分为如下四个阶段 1.预处理&#xff1a;头文件展开&#xff08;#include&#xff09;、宏替换&#xff08;#define&#xff09;、条件编译&#xff08;#ifdef&#xff09;(.i)使用预处理器&#xff08;预处理阶段处理的都是以#开头的代码&#xff09; 2.编译…

Linux(gcc编译原理、过程以及常用调试命令)

PS&#xff1a;红色字体表示重点&#xff0c;绿色字体表示重要标题&#xff0c;块引用中表示Linux终端中的命令。 1.gcc / g的安装 命令&#xff1a;sudo apt install gcc /gcc 2.gcc编译连接 //main.c文件 &#xff08;1&#xff09;预编译 ①删除所有的“#define”&#…

Linux中gcc编译步骤

我们这里以C语言为例&#xff0c;看看C语言程序在Linux中编译执行的详细步骤 1.创建一个.c文件 2.写入一些简单的代码 我们使用gcc -E filename.c -o filename.i 命令对程序先进行预处理&#xff1a;处理头文件、宏定义&#xff0c;接下来我们修改一下头文件&#xff0c;使用错…

Linux GCC常用命令

目录 一、示例一 1.简单编译 1.1预处理 1.2编译为汇编代码 1.3汇编 1.4连接 2.多个程序文件的编译 3检错 4库文件连接 二、示例二 1.准备hello.c 2.预处理 3.编译 4.汇编 5.链接 6.分析ELF文件 6.1ELF文件的段 6.2反汇编ELF 一、示例一 1.简单编译 创建文件mkd…

GCC编译过程及基本命令总结

一、GCC简介 GCC即GNU Compiler Collection&#xff0c;原本只是针对C语言的编译工具&#xff0c;现在已经变成了一个工具集&#xff0c;包含了C、C、JAVA等语言的集合体。 管理和维护&#xff1a;由GNU项目负责。 二、GCC对C、C的编译流程 (1) 预处理&#xff08;Preproce…

Linux 下的 gcc 编译常用命令

gcc&#xff1a;Linux下的一款编译器。 gcc工作流程&#xff1a; 完整编译流程&#xff1a; 创建一个c语言源文件&#xff1a; gcc -E hello.c -o hello.i&#xff08;头文件展开&#xff0c;进行源文件中的宏替换&#xff0c;注释过滤&#xff09; gcc -S hello.i -o hello.…

GCC命令编译

1.GCC编译过程&#xff08;原理如下&#xff0c;使用命令请见2&#xff09; 从 hello.c 到 hello(或 a.out)文件&#xff0c; 必须历经 hello.i、 hello.s、 hello.o&#xff0c;最后才得到 hello(或a.out)文件&#xff0c;分别对应着预处理、编译、汇编和链接 4 个步骤&#…

gcc 命令详解及最佳实践

介绍 GCC&#xff08;英文全拼&#xff1a;GNU Compiler Collection&#xff09;是 GNU 工具链的主要组成部分&#xff0c;是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件&#xff0c;由 Richard Stallman 于 1985 年开始开发。 GCC 原名为 GNU C语言编译器&#…