首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入了解linux系统—— 基础IO(上)

深入了解linux系统—— 基础IO(上)

作者头像
星辰与你
发布于 2025-05-19 01:01:08
发布于 2025-05-19 01:01:08
14800
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

文件

在之前学习C语言文件操作时,我们了解过什么是文件,这里简单回顾一下:

文件存在磁盘中,文件有分为程序文件、数据文件;二进制文件和文本文件等。

详细描述见文章:文件操作——C语言

  • 文件在磁盘里,磁盘是永久性存储介质,因为文件在磁盘上的存储是永久性的;
  • 磁盘是外设(是输入设备也是输出设备);
  • 本质上对磁盘是文件的所有操作,都是对外设的输入和输出;也就是I/O

对于文件的认识:

  • 文件 = 文件内容 + 文件属性
  • 文件大小是0KB的文件也是占用磁盘空间的
  • 所有对于文件的相关操作都是对文件内容和文件属性就行操作。

在系统层面理解

  • 我们操作文件(打开,关闭文件),本质上是进程对于文件的操作;
  • 磁盘的管理者是操作系统;
  • 我们在C/C++使用库函数来对文件进行读写操作,本质上是通过文件相关的系统调用去完成的。

C文件操作

打开和关闭文件

C语言当中,我们通过fopen来打开文件,fclose来关闭文件;

  1. fopen:打开文件,如果打开成功返回一个FILE*类型的指针,执行被打开的文件;打开失败则返回NULL
  2. fclose:关闭文件,传参FILE*类型的指针,关闭指定文件。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
int main()      
{      
    FILE* fp = fopen("log.txt","w");//以读方式打开,文件不存在就新建      
    if(fp == NULL){      
        perror("fopen");      
        return 1;      
    }      
    //....      
    fclose(fp);//关闭文件                                                              
    return 0;                                             
}  

打开文件的方式

我们知道在C语言的fopen接口打开文件是有很多打开方式

r:以读方式打开、w以写方式打开、a以追加方式打开。

r方式,当文件不存在时就打开文件失败; w方式,当文件不存在时就新建文件(在当前工作路径下创建,进程当中存放了当前工作路径);如果文件存在会清空当前文件的内容;然后在进入写入。 a方式,追加,当文件不存在就新建文件;如果文件已经存在,打开时不会清空文件内容,而是在文件末尾进行写入

写文件

当我们以w/r方式打开一个文件,我们要将内容写到文件当中;

img
img

我们可以使用fputcfputsfwritefprintf进行文件的写入;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
int main()      
{      
    FILE* fp = fopen("log.txt","w");//以读方式打开,文件不存在就新建      
    if(fp == NULL){      
        perror("fopen");      
        return 1;      
    }      
    for(char ch = 'a';ch <= 'z';ch++){    
        fputc(ch,fp);    
    }    
    char* str = (char*)"I love you\n";    
    fputs(str,fp);    
    int x = 100;    
    fprintf(fp,"x = %d\n",x); 
    fclose(fp);//关闭文件                                                              
    return 0;                                             
}  

文件读取

我们以r方式打开一个文件,我们要像读取这个文件的内容,我们可以使用fgetcfgetsfscanf进入文件内容的读取操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
int main()      
{      
    FILE* fp = fopen("log.txt","w");//以读方式打开,文件不存在就新建      
    if(fp == NULL){      
        perror("fopen");      
        return 1;      
    }
    for(int i = 0;i<26;i++){    
        printf("%c",fgetc(fp));    
    }    
    printf("\n");    
    char buff[20];    
    fgets(buff,12,fp);    
    //buff[11] = '\0';    
    printf("%s",buff);    
    int x;    
    fscanf(fp,"x = %d",&x);    
    printf("x = %d\n", x);  
    fclose(fp);//关闭文件                                                              
    return 0;                                 
}  

stdin/stdout/stderr

在我们程序运行时,C语言它会默认打开三个文件:stdinstdoutstderr

我们可以发现这三个都是文件类型指针

系统文件I/O

在上述C语言的文件操作fopenfclose都是语言层提供给我们的文件操作接口;以及C语言的stdinstdoutstderr;C++中的cincoutcerr都是语言层提供给我们的方案;

我们知道文件的管理者是操作系统,所以我们对文件操作都要经过操作系统;

那也就是说语言层的文件操作接口,其底层都封装了系统调用。

1. 传递多个标志位的方法

在之前的习惯中,我们通常使用一个参数来作为一个标记位;这样我们在传递多个标志位时就需要传递多个参数。

现在来了解一种使用一个参数来传递多个标志位的方法:

使用一个bit为来作为一个标识符,这样使用一个参数就可以表示多个标志位了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#define ONE 0001   //0000 0001
#define TWO 0002   //0000 0010
#define THREE 0004 //0000 0100   
void func(int flag){    
    if(flag & ONE)  printf("ONE ");    
    if(flag & TWO)  printf("TWO ");    
    if(flag & THREE)  printf("THREE ");    
    printf("\n");    
}    
int main()    
{    
    func(ONE);    
    func(ONE | TWO);    
    func(ONE | THREE);    
    func(ONE | TWO | THREE);  
    return 0;
}

这样就可以使用一个参数,传递多个标志位了。 Linux操作系统open接口就使用了一个参数来传递多个标志位。

2. 打开文件open

在语言层面,我们使用的fopen,它本质上就是对系统调用的封装;

可以看到open是一个系统调用;它的作用就是打开一个文件,也可能会创建一个新的文件。

我们可以看到open函数它存在一个两个参数的,也存在一个三个参数的;

  1. pathname:表示要打开文件的文件名(不带路径就默认在当前工作路径下)
  2. flags:表示文件的打开方式,存在多个标志位
  3. mode:表示新建文件时,文件的默认权限
文件名**pathname**

这个想必就不用多说了,表示要打开文件的文件名;

不带路径时,就表示在当前工作路径下打开文件。(进程中存在当前工作路径cwd

标志位**flags**

通过查看open函数说明可以看到,flags存在非常多的标志位;这里列举一些常用的选项

O_RDONLY只读、O_WRONLY只写、O_RDWR读写; O_CREAT:文件不存在时就新建文件 O_TRUNC:打开文件时,文件存在就清空文件内容 O_APPEND:打开文件时,以追加形式打开。

这里flags表示的就是文件的打开方式;

首先就是:只读、只写和读写;在我们打开文件时必须指定一个且只能指定一个。

O_CREAT

在我们打开一个文件时,如果这个文件不存在,那open函数就会直接返回-1表示文件打开失败;

而我们带了O_CREAT选项,就表明当文件不存在时,就新建文件;(这里新建文件要指明新建文件的权限,否则创建出来文件的权限就是乱码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      
    int fd = open("love.txt",O_CREAT | O_WRONLY,0666);      
    if(fd < 0){      
        perror("open");      
        return 1;                                                                                                 
    }                                                                                                            
    return 0;                                                                                                    
}    

一般情况下,在以写方式打开文件,文件不存在就新建,就要指明文件的权限。 (以只读读方式O_RDONLY,文件不存在新建出的文件是空的,没有什么意义)

O_TRUNC

当我们打开一个文件时,如果这个文件已经存在了,那就打开这个已有的文件;

如果我们带了O_TRUNC选项,就表示清空这个文件的内容;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      
    int fd = open("love.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);      
    if(fd < 0){      
        perror("open");      
        return 1;                                                                                                 
    }                                                                                                            
    return 0;                                                                                                    
}

O_APPEND

在C语言的文件操作中,fopen打开文件,w就是以写方式打开、文件不存在就新建、文件存在就清空文件的内容;(这就对应了上述选项的O_WRONLYO_CREATO_TRUNC

但是我们fopen还可以以a方式打开文件,也就是追加方式;这里的O_APPEND就是以追加的方式打开文件。

这里我们先看一种现象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      
    int fd = open("love.txt",O_CREAT | O_WRONLY,0666);      
    if(fd < 0){      
        perror("open");      
        return 1;                                                                                                 
    }
    char buff[] = "abcdef";
    write(fd,buff,strlen(buff));  
    return 0;                                                                                                    
}

可以看到,我们不带**O_APPEND**选项,写入的时候是在文件的开头位置进行写入的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      
    int fd = open("love.txt",O_CREAT | O_WRONLY | O_APPEND,0666);      
    if(fd < 0){      
        perror("open");      
        return 1;                                                                                                 
    }
    char buff[] = "abcdef";
    write(fd,buff,strlen(buff));  
    return 0;                                                                                                    
}
文件权限mode

当打开文件,文件不存在,我们还带了O_CREAT选项时;如果我们不带文件的权限,那新建文件的权限就是乱码;

而新建的文件的权限:文件权限 = 默认权限 &(~umask)

3. 关闭文件

关闭文件的系统调用close,根据文件描述符,关闭指定文件。

对于这里的fd,它指的是文件描述符,当我们打开文件成功时,会返回给我们该文件的文件描述符; 我们对指定文件的读写操作,以及关闭文件都要使用指定文件的文件描述符。

4. 文件写入write

在C语言中,我们进行文件写入时,我们有非常多的接口;

但是在系统层面,我们对文件进行写入只有一个接口,就是write

write有三个参数,分别是fdbuf、和count

其中fd指的是文件描述符,表示我们要向哪一个文件进行写入; buf表示我们要进行写入的内容,它是void*类型的指针,可以写入任何数据 count就表示,我们要写入内容的长度。

这里值的注意的是:这里**write**主要用于字符写入

当然,我们之前听过文本写入和二进制写入,那都是语言层的概念; 再这里我们操作系统不管这些,write就将给定的内容写入到文件缓冲区中。

5. 文件读取read

和写入一样,在语言层我们有非常多的函数接口,但是在系统层面,就只有read

这样存在三个参数;

fd文件描述符,表示要从哪一个文件读取数据; buf,表示我们要将文件中的数据读取到buf中; count表示要读取内容的长度。

文件描述符

在上面描述中,我们了解了文件操作相关的系统调用;

openwritereadclose这些系统调用中,都用到了一个fd来指明一个文件;那这个fd究竟是什么呢?

open函数的返回值

在上述使用open函数时,我们并没有关心open函数的返回值,也没有说明文件描述符到底是什么?

当我们使用open打开一个文件时: 如果打开成功,那就返回这个新打开文件的文件描述符; 如果打开失败,就返回-1,并且设置错误码。

什么是文件描述符

那我们知道了,文件描述符就是标识一个文件的整数,每一个文件的文件描述符都不一样;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      
    int fd = open("log.txt",O_CREAT | O_WRONLY | O_APPEND,0666);
    if(fd < 0)	return -1;
    printf("fd : %d\n",fd);
    close(fd);
    return 0;                                                                                                    
}

我们可以看到打开的一个文件的文件描述符是3

这里打开一个文件我们看不出来什么,我们多打开一些文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      
    int fd1 = open("log1.txt",O_CREAT | O_WRONLY | O_APPEND,0666);
    int fd2 = open("log2.txt",O_CREAT | O_WRONLY | O_APPEND,0666);
    int fd3 = open("log3.txt",O_CREAT | O_WRONLY | O_APPEND,0666);
    int fd4 = open("log4.txt",O_CREAT | O_WRONLY | O_APPEND,0666);
    //这里就不做错误判断了
    printf("fd1 : %d\n",fd1);
    printf("fd2 : %d\n",fd2);
    printf("fd3 : %d\n",fd3);
    printf("fd4 : %d\n",fd4);
    //不关闭文件,进程结束会自动关闭
    return 0;                                                                                                    
}

这里,我们可以发现我们打开多个文件,这些文件的文件描述符是线性增长的。

文件描述符0/1/2

在上述中,我们发现,我们的文件描述符它是线性增长的,而且我们打开第一个文件它的文件描述符是3

012文件描述符去哪里了呢?

还记得在程序运行时,C语言会默认给我们打开三个文件stdinstdoutstrerr; 在Linux操作系统中,进程默认情况下会有三个缺省打开的文件描述符(012),分别是标准输入、标准输出和标准错误。 那这里进程默认打开的标准输入、标准输出和标准错误和C语言中的**stdin**、**stdout**和**stderr**有什么区别呢?

这里**0**标准输入、**1**标准输出、**2**标准错误;

一般情况下0,1,2对应的物理设备是键盘、显示器、显示器。

所以,我们从键盘中读取数据就是从0文件中读取数据;将数据输出到显示器中就是将数据输出到1文件当中。

文件描述符的分配规则

当我们打开一个文件时,它的文件描述符是3;我们打开多个文件时,我们可以发现它的文件描述符是线性增长的;

那文件描述符是如何分配的呢?是一直在增长的吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>      
#include <unistd.h>      
#include <string.h>      
int main()          
{       
    int fd1 = open("log1.txt",O_CREAT | O_WRONLY | O_TRUNC, 0666 );    
    if(fd1 < 0)  return -1;    
    printf("fd1 : %d\n",fd1);    
    close(0);    
    close(2);    
    int fd2 = open("log2.txt",O_CREAT | O_WRONLY | O_TRUNC, 0666 );    
    if(fd2 < 0)  return -1;    
    printf("fd2 : %d\n",fd2);    
    int fd3 = open("log3.txt",O_CREAT | O_WRONLY | O_TRUNC, 0666 );    
    if(fd3 < 0)  return -1;    
    printf("fd3 : %d\n",fd3);
    return 0;           
}  

可以看到,我们关闭02文件之后,新打开文件的文件描述符是02

所以,这里我们文件描述符分配时,会从0开始去找到一个最小且没有被使用的文件描述符,再进行分配。

操作系统对于打开的文件的管理

对于上面的文件描述符,可以说很抽象,为什么可以使用一个整数来表示一个打开的文件呢?

现在来看操作系统是如何对被打开的文件进行管理的。

要想进行管理,那一定是先描述,再组织

**先描述:**操作系统要像对被打开文件进行管理,那就要先描述这些被打开文件;在Linux操作系统中就存在struct file结构体来描述这些被打开的文件(struct file里就可能有文件描述符等等一些关于文件的信息)。

所以,在打开一个文件时,就只需根据文件的相关属性构建相对应的struct file即可(还存在文件缓冲区,也会将部分内容拷贝到文件缓冲区中

再组织: 操作系统要将这些被打开文件(struct file)进行管理;在Linux操作系统中就存在一个全局链表,所以被打开文件的struct file都在这个链表当中。

这样操作系统就将所有被打开的文件管理起来的,但是现在还有一个问题,程序打开文件也就是进程要打开文件,那进程是如何打开的呢?

这个问题就比较简单了,我们的进程不是有对应的**task_struct**吗,那我们进程打开了哪些文件就肯定在**tasj_struct**中存储着相对应的信息。

task_struct中,存在着一个指针struct file_struct* files,这个指针指向进程相对应的文件描述符表; 而在文件描述符表中,存在着一个数组struct file* fd_array而我们的文件描述符就和这个**fd_array**数组的下标一一对应。

那么,也就是说我们文件描述符表在的**fd_array**数组,下标**0**、**1**…和我们文件描述符一一对应。

那么,在进程执行的过程中,只需要访问task_struct中的文件描述符表中的fd_array数组,就可以知道我们进程打开了哪些文件。

了解了操作系统对于被打开文件的管理,现在再来看文件描述符 它就是进程文件描述符表中fd_array的数组下标; 在新建文件时,操作系统就会遍历进程的描述符表中fd_array数组,找到一个最小且没有被使用的数组下标来作为新打开文件的文件描述符。

stdin/stdout/stderr和文件描述符0/1/2的区别

我们知道,在C语言程序启动时,它会默认打开三个文件stdin/stdout/stderr,这是语言层面的概念;

而文件描述符0/1/2这是操作系统层面的概念。

在C语言中**stdin/stdout/stderr**的类型都是**FILE***,我们只知道**FILE***是文件类型的指针,但是**FILE**它是什么呢?

其他的我们不懂,但是这里我们可以肯定在FILE中肯定存在文件对应的文件描述符;(因为C语言文件操作是封装了系统调用,而系统调用是使用文件描述符来访问文件的,所以在FILE肯定存在文件所对应的文件描述符)

并且我们也可以确定,**stdin**对应的文件描述符肯定是**0**、**stdout**对应的文件描述符肯定是**1**、**stderr**对应的文件描述符肯定是**2**。

这里提出一个问题?

我们知道文件描述符的分配规则是找一个最小且没有被使用的文件描述符进行分配。 那如果我们关闭了**0/1/2**文件,再创建文件那**0/1/2**还是标准输入、标准输出和标准错误吗?

答案是的,在语言层我们标准输入stdin中的文件描述符就是0、标准输出stdout中的文件描述符就是1、标准错误stderr中的文件描述符就是2

我们关闭0/1/2文件,这一操作是系统层的操作,我们语言层C它并不知道; 那也就是说,在程序往标准输出中输出数据时,它只会拿着stdout中的文件描述符1去调用系统调用; 那也就是说在系统层:文件描述符**0**指向哪个文件,哪个文件就是标准输入;文件描述符**1**指向哪个文件,哪个文件就是标准输出;文件描述符**2**指向哪个文件,哪个文件就是标准错误。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux之基础IO
那么是谁提供的文件读取的分类(文本类和二进制类)? 是语言本身。 库函数的接口是对系统调用进行了封装的结果。
摘星
2023/10/15
2330
Linux之基础IO
Linux-基础IO
  在刚开始学习Linux的时候,我们记住了Linux下一切皆文件,我们通过这篇文章来深入了解Linux下文件的构成及应用。
用户11029129
2024/06/04
2080
Linux-基础IO
【Linux】基础文件IO
无论是日常使用还是系统管理,文件是Linux系统中最核心的概念之一。对于初学者来说,理解文件是如何被创建、读取、写入以及存储的,是掌握Linux的必经之路。本文将深入探讨Linux文件IO的基础知识,从最基本的文件操作命令到系统调用,带你一步步揭开文件IO的神秘面纱。
ephemerals__
2025/06/12
1330
【Linux】基础文件IO
【Linux系统IO】二、文件描述符与重定向
​ 还记得我们之前调用 open() 接口的时候返回值叫做什么 文件描述符(file descripter) 吗,虽然我们还没有学习它,但是因为我们每次去调用 write() 和 read() 甚至是 close() 的时候,都离不开这个文件描述符参数,所以它肯定和文件之间有着密切关联💥 💥 💥
利刃大大
2025/03/02
2340
【Linux系统IO】二、文件描述符与重定向
【Linux系统】从 C 语言文件操作到系统调用的核心原理
本文将从文件的基本概念出发,先回顾 C 语言中文件操作的常用接口,再逐步过渡到 Linux 系统调用,解析文件描述符、文件打开对象、进程与文件的关系等关键概念。通过代码示例和原理分析,带你揭开 Linux 基础 IO 的神秘面纱,理解操作系统如何管理文件、进程如何与文件交互的底层逻辑。
suye
2025/05/29
1800
【Linux系统】从 C 语言文件操作到系统调用的核心原理
深入了解linux系统—— 基础IO(下)
在基础IO(上)中,我们了解了文件相关的系统调用;以及文件描述符是什么,和操作系统是如何将被打开的文件管理起来的。
星辰与你
2025/05/19
1040
深入了解linux系统—— 基础IO(下)
【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…
1.空文件也要在磁盘中占据空间,因为文件属性也是数据,保存数据就需要空间。 2.文件=内容+属性 3.文件操作=对内容的操作or对属性的操作or对内容和属性的操作 4.标识一个文件必须有文件路径和文件名,因为这具有唯一性。 5.如果没有指明对应的文件路径,默认是在当前路径下进行文件访问,也就是在当前进程的工作目录下进行文件访问。如果想要改变这个目录,可以通过系统调用chdir来改变。 6.在C语言中,调用fread、fwrite、fopen、fclose、等接口对磁盘中的文件进行操作,实际上必须等到代码和数据加载到内存中,变成进程之后,cpu读取进程对应的代码,然后操作系统才会对文件进行操作,而不是只要我们一调用文件操作的接口就会对文件操作,而是必须将这些接口加载到内存之后,才可以。 所以对文件的操作,本质上就是进程对文件的操作!!! 7.一个文件要被访问,必须先被打开。用户进程可以调用文件打开的相关函数,然后操作系统对磁盘上相应的文件进行处理。在磁盘上的文件可以分为两类,一类是被打开文件,一类是未被打开的文件。 8.所以,文件操作的本质就是进程和被打开文件的关系。
举杯邀明月
2023/04/12
1.4K0
【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…
【Linux】理解系统中一个被打开的文件
首先我们在前面的学习中,知道了 文件 = 内容 + 属性,那么我们对文件的操作就是分别对内容和属性操作。
YoungMLet
2024/03/01
3890
【Linux】理解系统中一个被打开的文件
【Linux篇】操作世界的“纤丝”:IO
前面我们知道,创建一个空文件时,这个空文件也会占用磁盘的空间,因为文件除了文件的内容,还有文件的属性。文件=内容+属性。 我们对文件的操作如:存取,都是围绕着文件的内容+属性展开的
用户11456817
2025/07/19
470
【Linux篇】操作世界的“纤丝”:IO
【Linux】文件操作、系统IO相关操作、inode和输入输出重定向
C语言中文件操作,在操作一个文件之前我们首先要打开它,那么在学了一段时间操作系统后,你知道在操作一个文件之前为什么要先打开吗? 文件存储在磁盘上,CPU执行进程访问文件,而CPU不能直接访问磁盘,所以对于存储在磁盘上的文件如果要被进程访问,首先应该加载到内存中,所以打开文件的过程就是将文件从磁盘加载到内存。
_小羊_
2025/01/24
2150
【Linux】文件操作、系统IO相关操作、inode和输入输出重定向
随笔水文——打开文件后会发生什么???
文件操作,这个熟悉而又陌生的词汇。在我们在图形化的电脑上,不断的双击打开很多不同的文件,且不关闭,你是否会好奇,OS它是如何打开管理这些不同的文件呢?
比特大冒险
2023/04/16
3280
随笔水文——打开文件后会发生什么???
【Linux】基础 IO(文件描述符fd & 缓冲区 & 重定向)
💫 那么我们现在有个问题,我们编好了代码,这个文件是不是就打开了 -- 没有,因为我们把代码写好之后,这个还只是一个文本,那是不是把代码编译成可执行程序,文件就打开了 -- 答案也是没有的,把原代码编译成可执行程序仅仅是跑起来了。
IsLand1314
2024/10/23
4960
【Linux】基础 IO(文件描述符fd & 缓冲区 & 重定向)
【Linux基础IO】一、系统IO
​ 我们知道 C语言 有文件操作接口,那么当然 C++、JAVA 这些语言都有文件操作接口。但是最让人烦的问题是这些语言之间的 IO 接口都是不一样的,这样子导致我们学习成本很高!
利刃大大
2025/02/28
3330
【Linux基础IO】一、系统IO
【Linux系统#5】基础 IO(文件描述符fd & 缓冲区 & 重定向)
✨ 黄粱一梦终须醒,镜花水月总是空 🌏
IsLand1314
2025/06/02
2240
【Linux系统#5】基础 IO(文件描述符fd & 缓冲区 & 重定向)
Linux基础IO【II】真的很详细
今天,我们接着在上一篇文章的基础上,继续学习基础IO。观看本文章之前,建议先看:Linux基础IO【I】,那,我们就开始吧!
破晓的历程
2024/06/24
1610
Linux基础IO【II】真的很详细
【Linux】 基础IO——文件(下)
但为啥是3,不是0 ,1,2 任何一个进程,在启动的时候,默认会打开当前进程的三个文件: 标准输入、标准输出、标准错误 ——本质都是文件 C语言:标准输入(stdin) 标准输出(stdout) 、标准错误(stderr) ——文件在系统层的表现 C++: 标准输入(cin) 标准输出(cout) 、标准错误(cerr) ——文件在系统层的表现,它是一个类
lovevivi
2023/05/02
2.4K0
【Linux】 基础IO——文件(下)
基础IO的理解与操作 - fd
        相信诸位学习过Linux的小伙伴对这句话不陌生吧。Linux下一切皆文件,也就是说在冯诺依曼体系下的任何东西,均可视为文件?为什么能这么说呢?
凯哥Java
2022/12/16
8820
基础IO的理解与操作 - fd
【Linux】基础IO_文件描述符
在前文中学习了open函数,我们知道open函数的返回值就是文件描述符,本章将对文件描述符进行详细讲解。
诺诺的包包
2023/05/04
1.6K0
【Linux】基础IO_文件描述符
【Linux课程学习】:文件第一弹---文件基础(文件描述符的底层设计)
https://blog.csdn.net/djdjiejsn/category_12669243.html
用户11396661
2024/12/09
2250
【Linux课程学习】:文件第一弹---文件基础(文件描述符的底层设计)
【Linux基础IO】深入Linux文件描述符与重定向:解锁高效IO操作的秘密
前言:在Linux操作系统的广阔世界中,文件描述符(File Descriptor,简称fd)和重定向是理解并高效利用Linux IO(输入/输出)机制的关键基石。它们不仅是系统编程中不可或缺的概念,也是日常命令行操作中的强大工具。掌握这些概念,将使你能够更深入地理解Linux如何管理文件、进程间的通信以及数据的流动,从而编写出更加高效、健壮的应用程序,同时在系统管理和脚本编写中也能游刃有余
Eternity._
2024/09/24
3640
【Linux基础IO】深入Linux文件描述符与重定向:解锁高效IO操作的秘密
推荐阅读
相关推荐
Linux之基础IO
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档