【Linux】基础IO

这篇具有很好参考价值的文章主要介绍了【Linux】基础IO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基础IO

1. 系统文件I/O

操作文件,除了C接口外,我们还可以采用系统接口来进行文件访问,我们来看看如下代码:

【Linux】基础IO

【Linux】基础IO

读文件

【Linux】基础IO

【Linux】基础IO

1.1 接口介绍

open man open

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

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

pathname: 要打开或者创建的目标文件
flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个进行“或”运算,构成flags
参数:
    O_RDONLY:只读打开
    O_WRONLY:只写打开
    O_RDWR:读,写打开
    		这三个常量必须指定,并且只能指定一个
    O_CREAT:若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
    O_APPEND:追加写
    
返回值:
    成功:新打开的文件描述符
    失败:-1

open函数具体使用那个,和具体的应用场景有关,如果目标文件不存在,需open创建,第三个参数表示创建文件的默认权限。

1.2 open函数返回值

认识一下两个概念:系统调用和库函数

  • fopen fclose fread fwrite都是C语言标准库中的函数,我们称之为库函数
  • open close read write lseek 都属于系统提供的接口,称为系统调用接口

之前的博客中用到的一张图:

【Linux】基础IO

系统调用接口和库函数的关系一目了然

1.3 文件描述符

我们知道了文件描述符就是一个小小的整数

在计算机操作系统中,文件描述符是用于访问文件和I/O设备的一个抽象概念。它是一个非负整数,用来标识一个已经打开的文件或I/O设备。在Unix、Linux和其他类Unix系统中,文件描述符是一种非常常见的概念。

文件描述符通常被用于在程序中访问打开的文件或设备,如磁盘文件、标准输入、标准输出等。它们是一种轻量级的机制,能够提供高效、灵活的I/O操作,因为它们可以被用来表示任何类型的I/O流,包括文件、管道、套接字等。

文件描述符通常是通过调用系统调用(如open、close、read、write等)返回的,操作系统会维护一个表格来跟踪打开的文件和设备以及相应的文件描述符。在使用文件描述符时,程序需要保证文件描述符的唯一性,因为文件描述符是在系统范围内唯一的。

一般来说,标准输入、标准输出和标准错误输出的文件描述符分别是0、1、2。其他文件描述符的值通常是由操作系统分配的,通常是一个递增的整数。例如,打开一个文件会返回一个新的、当前未使用的文件描述符。关闭文件时,该文件描述符会被释放,并可以被其他打开的文件或设备使用。

【Linux】基础IO

1.4 0 & 1 & 2

  • Linux默认情况下会有3个缺省打开的文件描述符,分别是标准输入0,标准输出1,标准错误2
  • 0,1,2对应的物理设备一般是:键盘,显示器,显示器

所以输入和输出还可以采用如下方式:

【Linux】基础IO

【Linux】基础IO

现在我们知道,文件描述符就是从0开始的整数。当我们打开文件的时候,操作系统要创建相应的数据结构来描述目标文件,于是就有了file结构体。表示已经打开的文件对象。而执行open系统调用,所以必须要让进程和文件关联起来。每个进程都有一个*files指针,指向一张表files_struct,这个表最重要的部分就是包含了一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是这个数组的下标。所以,只要拿着文件描述符就可以找到对应的文件

1.5 文件描述符的分配规则

我们可以查看如下代码:
【Linux】基础IO

输出查看我们发现是:3

关闭0或者2重新查看:

【Linux】基础IO

我们可以发现这个规律:文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符

1.6 重定向

如果我们关闭1会发生怎么的事情呢?我们看如下代码:

【Linux】基础IO
此时我们发现本该在显示器上显示的内容,输出到了文件当中。这种现象叫做重定向

【Linux】基础IO

2. 使用dup2系统调用

函数原型是这样:

#include <unistd.h>

int dup2(int oldfd, int newfd);

【Linux】基础IO

printf是C库当中的一个IO函数,一般往stdout中输出,但是stdout访问底层文件的时候还是找的是fd : 1,但是fd1已经变成了myfile的地址,不在是显示器文件的地址,所以输出的任何消息都是往文件中写入,进而完成输出重定向。

3. FILE

  • 因为IO相关的函数与系统调用接口对应,并且库函数封装系统调用,所以本质上访问文件都是通过fd访问的
  • C库的FILE内部,必定封装了fd

【Linux】基础IO

【Linux】基础IO

【Linux】基础IO

以上的代码运行结果是:

【Linux】基础IO

但是我们如果对进程实现输出重定向会怎么样?.test > myfile,我们发现结果是这样:

【Linux】基础IO

我们发现printffwrite都输出了两次,但是write只输出了一次(系统调用)这是为什么?

  • 一般C库函数写入文件是全缓冲,但是写入显示器是行缓冲
  • printffwrite自带缓冲区,当发生重定向到普通文件的时候,数据的缓冲方式变成了全缓冲
  • 而我们放在缓冲区的数据就不会立即刷新,甚至fork之后
  • 但是进程退出之后,会统一刷新,写入到文件当中
  • fork的时候父子进程数据会发生写时拷贝,所以当父进程准备刷新的时候,子进程也有了同样的数据,随机产生两份数据
  • write没有所谓的缓冲

所以我们可以发现:printffwrite库函数自带缓冲区,而write系统调用没有带缓冲区,另外这里的缓冲区都是用户级缓冲区文章来源地址https://www.toymoban.com/news/detail-416760.html

到了这里,关于【Linux】基础IO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux操作系统基础

    目录 计算机存储结构 冯.诺依曼结构 操作系统  在前几期我们学写了linux中常见的一些指令,本期我们将正式进行linux操作系统的学习。 要学习linux操作系统,我们就得先进行计算机存储结构的学习,要进行计算机存储结构的学习,我们就得先学习冯.诺依曼结构。 讲述冯诺依

    2024年01月16日
    浏览(47)
  • 【Linux操作系统】【综合实验一 Linux操作基础】【浅试Linux命令】

    Linux均以文件形式存在 本文出现的命令浅尝辄止,具体使用参考文档即可 解决一个任务的方法很多,本文仅浅试了一些简单的命令 要求掌握Linux基础操作,熟悉Linux行界面,并 明白操作的原理以及目的(难) ;熟悉Linux系统环境。 通过这个第一阶段实验,要求掌握以下操作

    2023年04月08日
    浏览(98)
  • Linux云计算之Linux基础1——操作系统理论基础

    目录 1、UNIX 的诞生和广泛使用 2、CPU 架构类型 3、CPU 指令 4、计算机程序设计和执行过程 5、操作统OS 6、编程层次 7、程序的内部运行接口 8、UI程序接口(人机交互接口) 9、程序的运行模式: 10、POSIX:可移植操作系统规范 11、计算机开源领域 12、Linux 发行版:(商业和社区) 这里

    2024年04月08日
    浏览(71)
  • Linux操作系统(六):文件系统组件

    参考资料:阿秀的笔记 Linux 「一切皆文件」 不仅 普通的文件和目录 ,就连 块设备、管道、socket 等,也都是统一交给文件系统管理的。 如何唯一标识文件? 索引节点 inode ,记录了文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位

    2024年04月11日
    浏览(36)
  • Linux操作系统学习,Linux基础命令大全

    友情提醒 先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。 ①Linux是基于Unix的开源的免免费的一款操作系统,由于系统的稳定性和安全性被成为程序代码运行的最佳操作系统环境。 ②Linux发行版的不同,可以分为 1)乌班图:Ubuntu 2)红帽

    2024年02月14日
    浏览(64)
  • Linux文件操作基础及基本I/O函数使用

    Linux是一个基于文件系统的操作系统,文件操作是其中一项最基本的任务之一。通过文件操作,用户可以创建、移动、复制、读取和修改文件及目录等。 1.ls:列出目录中的文件和子目录。 ls -a:显示所有包括隐藏文件。 ls -l:使用长格式输出文件详细信息。 ls -h:显示文件大

    2024年02月01日
    浏览(39)
  • 掌握终端基础技巧:Linux下的文件和目录复制操作

    在Linux系统中,命令行终端是一个大而高效的工具,让使用者可以通过简单的命令完成各种任务。其中,文件和目录的复制操作是日常使用频率较高的一项操作。本文将介绍Linux下的文件和目录复制基础技巧,帮助您更好地掌握命令行终端的使用。 一、复制文件: 1.cp命令:

    2024年02月08日
    浏览(50)
  • Linux操作基础(系统安全及应用)

    (1)将非登录用户的shell设置成/sbin/nologin (2)锁定长期不使用账号权限 (3)删除无用账号 (4)锁定账号文件psswd、shadow 通过md5sum 可以查看校验和来判断文件有没有被修改过 在新添加一个用户之后,他的校验和发生了变化。 1.21 设置密码有效期 针对新用户 在进入vim /et

    2023年04月19日
    浏览(42)
  • Linux操作系统——文件详解

    首先,当我们在磁盘创建一个空文件时,这个文件会不会占据磁盘空间呢? 答案是当然会占据磁盘空间了,因为文件是空的,仅仅指的是它的内容是空的,但是该文件要有对应的文件名,文件的大小,文件的创建时间,文件的权限等等,这些叫做文件的属性,是一个往往被人

    2024年01月16日
    浏览(43)
  • Linux - 文件操作和系统接口

                                                                                                                  感谢各位 点赞 收藏 评论 三连支持                                               本文章收录于专栏【Linux系统编程】   

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包