首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux-基础IO

第二个参数: 基本单位的大小。 第三个参数: 表示写入多少个基本单位。 第四个参数: 表示文件流。 返回值: 表示写入的基本单位的个数,也就是第三个参数。...我们使用Linux都知道,想要对一个文件进行操作,我们必须要打开一个文件,这是必须的。但是为什么 显示器文件、键盘文件 这些文件我们并不需要直接打开就可以直接使用呢?...✈️open函数 open函数是fopen函数的底层,其为Linux的系统调用,函数原型为: int open(const char *pathname, int flags, mode_t mode)...不需要创建文件时,这个参数不必传参。   ...不仅如此,C语言的很多接口的参数也都是FILE* 类型:    拿fwrite来举例,仅仅是把 *ptr 的 (size * nmemb) 字节大小的内容拷贝到 FILE 缓冲区内,需要的时候内部再决定如何刷新

10610

【Linux】探索文件IO奥秘,解锁软硬链接与生成动静态库知识

int fd1 = open("log1.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666); 所以我们的flags就实现一个参数就可以有多个参数传参的效果!...open 函数具体使用哪个,和具体应用场景相关,如目标文件不存在,需要open创建,则第三个参数表示创建文件的默认权限,否则,使用两个参数的open。...3.文件描述符fd 通过对open函数的学习,我们知道了文件描述符就是一个小整数 3.1 0 & 1 & 2 Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误...我们再调用fwrite的时候,有效减少我们调用系统中的write,我们要清楚调用系统调用是有成本的,时间和空间的成本,每次调用fwrite,我们可能把数据放在了语言层面的缓冲区,有效减少调用系统调用的次数...一个block的大小是由格式化的时候确定的,并且不可以更改。 Linux磁盘文件特性:文件 = 内容 + 属性。 内容和属性分开存储,文件名不属于文件属性!

10610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】从零开始认识进程间通信 —— 管道

    进行通信的时候,每个进程关闭不需要的文件描述符,然后通过缓冲区来单向通信。一个进程把信息写入缓冲区,另一个进程从缓冲区读取数据,不需要刷新到硬盘,直接从内存进行操作!...有个问题:父子既然要关闭不需要的fd那为什么曾经还要打开呢?可以不关闭吗? 如果父进程只打开读写的fd,那么子进程也就只能继承读写的fd,这就坏事了,总得有人写入吧!...那为什么不直接以读写方式打开一个fd呢?这样肯定不可以,子进程继承后也具有读写,也坏事了! 所以不关闭是为了让子进程可以继承下去,到时候关闭不需要的就可以了!...pipefd[2] 这是一个输出型参数,把以读方式打开的文件描述符rfd和以写方式打开的文件描述符wfd记录下来! 和open不同的是,这个系统调用不需要文件路径和文件名,所以才叫匿名管道!...这里提一个概念,在管道读写是"原子"的,每个"原子"是 4096 bytes。只有小于这个大小,就不会在读写时被其他人影响。如果大于一个原子的大小,就不能保证安全了。

    12700

    【Linux】IPC 进程间通信(一):管道(匿名管道&命名管道)

    1.3 进程间通信的方式 管道(通过文件系统通信) 匿名管道pipe 命名管道 System V IPC (聚焦在本地通信) System V 消息队列 System V 共享内存 System V...如下图: Linux 系统编程中使用 mkfifo 函数创建一个管道文件,再让两个不相关的进程打开: int mkfifo(const char *pathname, mode_t mode); 参数...0666的命名管道 注意事项 路径名:确保要创建的命名管道路径名合法且没有重复。...管道分为两种类型:无名管道和命名管道 无名管道主要用于具有亲缘关系的进程(如父子进程),在创建时不需要名称,只能通过文件描述符进行访问 命名管道(FIFO)则可以在任何进程之间通信,使用文件系统中的路径来标识...管道的特点 管道是单向的:数据在一个方向上流动,从写端(写入数据的进程)到读端(读取数据的进程) 在写端,数据会被写入一个缓冲区,读端则从这个缓冲区读取数据 管道的缓冲区大小有限,因此如果写入的数据超过缓冲区容量

    13810

    Linux:基础IO

    ——>操作系统必须按照先描述再组织的方式把被打开的文件管理起来!!  1.3 回忆C的文件操作接口 1.3.1 文件的打开和关闭  问题1:为什么我们默认会新建在当前路径,凭什么???...——>当前路径,其实就是进程的路径,因为进程在执行的过程中,他需要知道自己从哪来,也要知道如果自己产生一些临时性的文件时应该放在哪里,所以他需要一个默认路径cwd。表明的是他当前的工作目录。...参数pathname是文件名,参数flags是打开的模式,而mode是权限设置      因此第一个open是用来打开一个已经存在的文件,而第二个open打开的是新建的文件(因为我们需要给新建的文件设置权限...——> 因为我们使用的是系统调用接口,并且参数buf也是void*指针,所以他并不知道你传的是什么,只知道默认把一个个字符放在缓冲区里,所以如果我们想让他按照C语言字符串的形式去读取出来,那么就需要加个...——> 1、从总体来看东西是你送还是快递公司送其实都差不多,区别就是你不需要操太多心。因此缓冲区方便了用户!!

    8410

    CVE-2022-0847-DirtyPipe原理 | 文件覆写提权

    Linux内核的技巧:sendfile()系统调用允许应用程序将文件内容发送到套接字中,而不需要往返于用户空间(这种优化在通过HTTP提供静态文件的网络服务器中很流行)。...检查新数据是否可以追加到现有的管道缓冲区的历史: ​ 5274f052e7b3(Linux 2.6.16, 2006) "引入sys_splice()系统调用" 介绍了splice...如果有,那么写入中央目录文件头的write()调用将被写入最后一个压缩文件的页面缓存中。但是,为什么只有该头文件的前8个字节?...从页面缓存的角度来看,其余的页面是未使用的(尽管管道缓冲区代码确实使用了它,因为它有自己的页面填充管理)。为什么这种情况不经常发生呢?因为页面缓存不会写回磁盘,除非它认为该页面是 "脏的"。...\n"); //执行提权操作system("") return EXIT_SUCCESS; } 六、解决方案 更新升级 Linux 内核到以下安全版本: Linux 内核 >= 5.16.11

    82130

    Linux:进程间通信(一.初识进程间通信、匿名管道与命名管道、共享内存)

    内存中的缓冲区:管道实际上是一个在内核中维护的缓冲区,用于存储从写入端发送但尚未被读取端读取的数据。这个缓冲区的大小是有限的,如果写入的数据超过了缓冲区的大小,写操作可能会被阻塞,直到有空间可用。...只要管道中没有新的数据到来,读端进程就会一直阻塞等待 管道内部被写满而且读端(父进程)不关闭自己的fd,写端(子进程)写满之后,就要阻塞等待 管道具有固定的缓冲区大小,当缓冲区中的数据量达到上限时...由于inode结构体和缓冲区是在内核中维护的,因此多个进程可以共享相同的inode结构体和缓冲区,而不需要为每个进程复制一份。这种共享机制可以节省内存空间,并确保多个进程对同一文件的操作是一致的。...5.System V共享内存 实现进程间通信的前提就是如何让不同的进程看到同一份资源 匿名管道我们是通过子进程继承父进程打开的资源 命名管道是通过两个进程都打开具有唯一性标识的命名管道文件(路径+...文件名) 共享内存其实是通过OS创建一块shm System V共享内存(Shared Memory)是一种Linux中用于进程间通信(IPC)的机制。

    44320

    【Linux】基础IO>文件系统&&软硬链接&&动静态库详解

    ,如目标文件不存在,需要open创建,则第三个参数表示创建文件的默认权限,否则,使用两个参数的open write read close lseek ,类比C文件相关接口 2.3.3 open函数返回值...所以,可以认为,f#系列的函数,都是对系统调用的封装,方便二次开发 2.4 文件描述符fd 通过对open函数的学习,我们知道了文件描述符就是一个小整数 2.4.1 0 & 1 & 2 Linux...write 没有变化,说明没有所谓的缓冲 综上: printf fwrite 库函数会自带缓冲区,而 write 系统调用没有带缓冲区。...printf fwrite 是库函数, write 是系统调用,库函数在系统调用的“上层”, 是对系统调用的“封装”,但是 write 没有缓冲区,而 printf fwrite 有,足以说明,该缓冲区是二次加上的...在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放 4.2.1 硬链接的作用 构建Linux的相对路径结构,让我们可以通过. ..来进行路径定位(Linux中,不允许给目录建立硬链接

    12710

    【Linux】基础IO_文件操作

    .); str:表示要写入的缓冲区的地址 size:表示该缓冲区的大小 format:格式化可变参数(比如:"%d:%s\n",x,y ) 演示代码如下: #include #include...文件的打开 对于文件的打开,我们采用open系统调用函数。...参数pathname:打开或创建的目标文件(默认在当前路径打开/创建)。 参数flags:多参数选项,用一个整形来实现多个选项的传递。...: 返回值:写入成功,会返回写入的内容的大小(单位:字节)失败返回-1 参数fd:文件描述符即open函数的返回值 参数buf:缓冲区的地址 参数count:表示写入的文件的大小 具体案例操作: #include...参数buf:缓冲区地址,用来存放读到的数据 count:一次读取字符的大小到缓冲区buf 具体操作如下: #include #include #include

    71920

    系统文件IO文件描述符重定向FILE缓冲区的理解

    ,选择路径,默认当前路径 flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。...下面是open接口、write接口和read接口的使用: 三个参数的: 以写的方式: O_WRONLY:只写打开,但是在没有文件存在的时候,会打开失败,可以或上O_CREAT,默认权限为666。...open,然后操作系统自动给我们传入了FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666等等的参数!...所以,从3开始的原因就是0,1,2被占用了。 那么为什么是从0开始,0,1,2,3,4...这样的顺序呢?  ...这就是所谓的Linux一切皆文件! FILE/缓冲区问题 上面我们提到,因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问的。

    85630

    Linux:基础IO(一.C语言文件接口与系统调用、默认打开的文件流、详解文件描述符与dup2系统调用)

    参数:path 是一个字符串,表示要更改到的目录路径。 返回值:如果成功,则返回 0;如果失败,则返回 -1。...那这就说明OS一定提供了相关的系统调用接口 4.相关系统接口 4.1open() 在2号手册,说明是系统调用接口 open 函数是用于打开文件的系统调用函数。...打开失败的话返回-1(不需要创建文件时,就使用两个参数就好了) flags 参数可以是以下标志的组合(都是一个个宏): O_RDONLY:只读 O_WRONLY:只写 O_RDWR:读写 O_CREAT...虚拟文件系统:Linux中的虚拟文件系统(Virtual File System,VFS)将不同类型的文件系统(如ext4、NTFS、procfs等)抽象成统一的文件接口,使得用户和应用程序可以以统一的方式访问不同的文件系统...系统调用: Linux 提供了一系列系统调用(如 open()、read()、write()、close() 等),用于在用户空间和内核空间之间进行文件操作。

    37810

    Linux:认识文件

    ——>操作系统必须按照先描述再组织的方式把被打开的文件管理起来!!  1.3 回忆C的文件操作接口 1.3.1 文件的打开和关闭  问题1:为什么我们默认会新建在当前路径,凭什么???...参数pathname是文件名,参数flags是打开的模式,而mode是权限设置      因此第一个open是用来打开一个已经存在的文件,而第二个open打开的是新建的文件(因为我们需要给新建的文件设置权限...如果用第一个open去新建不存在的文件,会出现文件的权限错误!!所以必须用第二个open!...——>肯定直接或者间接(间接的意思是可能内部还有别的结构对象)包含如下属性: (1)在磁盘的什么位置 (2)基本的属性:权限、大小、读写位置、谁打开的) (3)文件的内核缓冲区 (4)引用计数(因为一个文件可能会被多个进程打开...——> 因为我们使用的是系统调用接口,并且参数buf也是void*指针,所以他并不知道你传的是什么,只知道默认把一个个字符放在缓冲区里,所以如果我们想让他按照C语言字符串的形式去读取出来,那么就需要加个

    9010

    Linux基础IO全面介绍

    fgets 与 get 完全不同:fgets 不仅接受流参数,还允许指定 str 的最大大小并在字符串中包含任何结束的换行符。..., stdout, stderr, 任何一种编程语言的文件操作相关的函数(库函数)底层都会调用系统调用接口(open、close、write、read,这些在 Linux 系统下有,但这些接口不具备可移植性...,如目标文件不存在,需要 open 创建,则第三个参数表示创建文件的默认权限, 否则,使用两个参数的 open。...write 没有变化,说明没有所谓的缓冲 printf fputs 等 库函数会自带缓冲区,而 write 系统调用没有带缓冲区。另外,我们这里所说的缓冲区,都是用户级缓冲区。...printf fprintf 是库函数, write 是系统调用,库函数在系统调用的 “上层”, 是对系统调用的 “封装”,但是 write 有内核级缓冲区,而 printf fwrite fputs

    40840

    Linux :进程间通信之管道

    ——>管道在设计的时候就是不能支持同时读写的!! ——>另一方面 open是有路径的,因为他是一个真实存在的文件,而我们如果想打开一个内存级文件,就必须用接口pipe! ...参数是一个 pipefd[2] 输出型参数 他会在该进程的文件描述符表中找到两个下标最小的位置,然后一个为读端打开的fd 放在pipefd[0]中  一个为写端打开的fd 放在pipefd[1]中  这样用户可以通过这个输出型参数拿到...5、管道是有固定大小的(Linux中是64KB)且具有原子性,但是在不同的内核里可能有区别   验证管道大小: 最后写到65536说明管道大小是64kb  ulimit 命令用于限制 shell 进程及其所创进程的资源使用...(4KB) 问题:可以我们验证的时候管道大小是64kb,那为什么pipesize是4kb呢?? ——> 因为管道具有原子性!!...——>同一路径下的文件名:路径+文件名 (唯一性) 命名管道有自己的名字,所以他的体系还是跟文件一模一样的体系,只不过区别是他不会刷盘!!

    7710

    【读懂Linux】基础IO

    open 函数具体使用哪个,和具体应用场景相关,如目标文件不存在,需要 open 创建,则第三个参数表示创建文件的默认权限, 否则,使用两个参数的 open 。...而, open close read write lseek 都属于系统提供的接口,称之为系统调用接口 回忆一下我们讲操作系统概念时,画的一张图 系统调用接口和库函数的关系,一目了然。...为什么呢?肯定和fork有关! 一般C库函数写入文件时是全缓冲的,而写入显示器是行缓冲。...write 没有变化,说明没有所谓的缓冲 综上: printf fwrite 库函数会自带缓冲区,而 write 系统调用没有带缓冲区。另外,我们这里所说的缓冲区,都是用户级缓冲区。...printf fwrite 是库函数, write 是系统调用,库函数在系统调用的 “ 上层 ” , 是对系统调用的“ 封装 ” ,但是 write 没有缓冲区,而 printf fwrite

    9010

    python文件读写(open参数,文件

    python文件读写(open参数,文件缓冲,内存映射,临时文件) 1.基本方法 文件读写调用open函数打开一个文件描述符(描述符的个数在操作系统是定义好的) python3情况下读写文件: f...2.设置文件缓冲 缓冲分三种: 全缓冲 : open函数的buffering设置大于1的整数n,n为缓冲区大小,linux默认为page的大小4096 满了n 个字节才会写入磁盘 。...f=open(“demo.txt”,’w’,buffering=1) 行缓冲 : open 函数的buffering设置为1, 碰到换行就会将缓冲区的写入磁盘。...f=open(“demo.txt”,’w,’,buffering=0) 缓冲的目的:是为了减少系统的io调用。只有当符合一定条件(比如缓冲数量)时才调用io。...可以进行类似于list的操作。比如分片等。 4.访问文件的状态 比如文件类型 ,访问权限,最后修改时间点,文件大小 使用系统的调用就可以达到,也可以使用os.path来进行。

    1.5K20

    【Linux】理解系统中一个被打开的文件

    其中 open 系统接口第一个参数 pathname 我们都知道,就是需要打开文件的名字;关于第二个参数我们需要介绍一下,关于函数传入标志位的技巧,是 Linux 中常用的传参方式;例如我们想在函数传参的时候传入指定的宏...的第二个参数实际上是一些系统定义的宏定义,在 open 的介绍文档中有介绍,如下图: 当我们想要以什么方式打开该文件时,就传入对应的宏定义,这就是 open 的第二个参数。...: 如上图,write 的参数列表比较好理解,第一个参数 fd 就是需要写入文件的文件描述符;第二个参数 buf 就是需要写入的字符串;第三个参数 count 就是需要写入的个数,注意这里不需要把 \0...那么操作系统为什么要默认把 stdin、stdout、stderr 打开呢?答案是为了让程序员默认进行输入输出代码编写! 那么我们现在就要回答上面的问题了,如何理解Linux下一切皆文件呢?...至于C语言缓冲区,它可以积累上一段时间再一次性写入到操作系统中,只跑一次就能大大提高效率! 那么我们为什么要提高 printf 的调用效率呢?

    23010

    【在Linux世界中追寻伟大的One Piece】IO基础

    open函数具体使用哪个,和具体应用场景相关,如目标文件不存在,需要open创建,则第三个参数表示创建文件的默认权限,否则,使用两个参数的open。...而open、close、read、write、lseek都属于系统提供的接口,称之为系统调用接口。 系统调用接口和库函数的关系,一目了然。...为什么呢?肯定和fork有关。 一般C库函数写入文件时是全缓冲的,而写入显示器是行缓冲。...综上:printf、fwrite库函数会自带缓冲区,而 write 系统调用没有带缓冲区。另外,我们这里所说的缓冲区,都是用户级缓冲区。...printf、fwrite是库函数, write是系统调用,库函数在系统调用的"上层", 是对系统调用的"封装",但是write没有缓冲区,而printf、fwrite有,足以说明,该缓冲区是二次加上的

    11610

    Python open函数详解「建议收藏」

    open函数有八个参数,如下。 file:文件路径或文件描述符。如为文件路径则是str类型,如是文件描述符,则是一个非负整数。文件描述符使用较少,通常情况下都传入文件路径。...r、w、a、x是基本的操作模式,mode参数不管指定为什么,必定是基于这四种操作模式之一。这句话怎么理解呢?...为负整数时,缓冲区的大小设置使用系统默认缓冲机制,具体会遵从以下两点策略。...一,当mode参数为二进制模式时,采用固定块内存缓冲区方式,内存块的大小根据系统设备分配的磁盘块来决定,如果获取系统磁盘块的大小失败,就使用内部常量io.DEFAULT_BUFFER_SIZE定义的大小...buffering若为1,则表示缓冲区采用行缓冲区,即只能放一行数据,遇到换行符即清空缓存,将数据写入磁盘。buffering为大于1的正整数时,这个正整数即代表缓冲区的大小,单位为字节。

    2K20
    领券