乐趣区

关于linux编程:基础IO

关上文件(open 函数)

  • 任何一个过程在运行时都会默认关上三个文件

    • 规范输出 stdin(键盘)
    • 规范输入 stdout(显示器)
    • 规范谬误 stderr(显示器)

open 函数原型

  • pathname:要关上的文件门路。
  • mode:指定要用什么权限关上文件。
  • 返回值:关上失败则返回 -1,关上胜利则返回一个文件描述符。
int open(const char *pathname, int flags);   // 用于关上曾经存在的文件
int open(const char *pathname, int flags, mode_t mode);  // 用于关上不存在的文件 

文件权限 mode

  • 创立文件时,mode 用于设定新文件的权限。

    • 该权限是以权限编码值来设定的(例如设置为 0666)
    • 该权限受权限掩码 umask 的限度。

flags 属性详解

  • 关上文件的形式:

    • O_RDONLY:示意以只读形式关上。
    • O_WRONLY:示意以只写形式关上。
    • O_RDWR:示意以可读可写形式关上。
  • 写入数据的形式:

    • O_APPEND:写入数据时,以在开端追加的形式写入。
    • O_TRUNC:写入数据时,以笼罩的形式写入(即先删除原数据,再写入)
    • 如果同时应用:O_TRUNC 起作用
    • 同时不应用:原文件内容不变(不读不写)
  • 关上不存在的文件时:

    • O_CREAT:关上不存在的文件时,会在以后门路主动创立这个文件,如果文件存在,则会先删除这个文件再创立文件。
    • 所谓以后门路是指过程启动时所处的门路,而不是程序文件所存在的门路。

    读文件(read)

    函数原型

  • fd:文件描述符
  • buf:寄存读取的数据
  • count:冀望读取的字节数
  • 返回值是理论读取的字节数。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

写文件(write)

函数原型

  • fd:文件描述符
  • buf:须要写入的内容
  • count:冀望写入的字节数
  • 返回值是理论写入的字节数。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

C 语言中的 fopen、fwrite、fread

  • c 语言中的文件函数 fopen 等,其底层都是调用零碎的 open 函数等。
  • 并且 fopen 等返回值为文件指针,open 返回值是文件描述符(int 类型)
  • 这样实现一种语言上的封装,实现跨平台性。

文件描述符

  • 在零碎中任何时刻都存在大量的曾经关上的文件。
  • 磁盘文件中存储的不只是文件内容,还包含文件属性
  • 内存文件中存储的更多是文件属性,文件内容是迟缓的从硬盘文件中加载的。
  • 零碎调配文件描述符的办法:

    • 以后曾经应用的文件描述符不会再次被调配,新调配的文件描述符的值是零碎中未被调配的文件描述符的值中最小的一个。

文件描述符的意义

  • 每个过程中都存在一个过程管制块 PCB
  • 这个 PCB 的构造体 task_struct 中存在一个文件构造体 files_struct
  • 这个文件构造体中存在一个用来存在文件指针的数组 struct file* fd_array []
  • 运行过程,关上文件后,就会将文件的指针寄存在这个数组中
  • 所谓的文件描述符则是对应文件在数组中的下标。
  • 因为过程的独立性,在这个过程中将文件敞开,对其余过程没有影响。

复制文件描述符

dup 函数介绍

  • 调用 dup 函数对文件描述符 fd1 进行复制,会返回一个新的文件描述符(留神:这个新的文件描述符 fd2 在数值上不等于 fd1,然而它们都指向同一个文件)
  • 应用 dup 复制时,这个新的文件描述符 fd2 的值是无奈本人指定的,是由操作系统外部调配的。
#include <unistd.h>
int dup(int oldfd);
//fd2 = dup(fd1);

dup2 函数介绍

  • 应用 dup2 复制时,这个新的文件描述符的值是能够本人指定的。
  • fd1 是原来的文件描述符的值,16 是人为指定新的文件描述符。
  • 如果正确,返回值 fd2 就是 16,如果谬误,返回值 fd2 就是 -1。
#include <unistd.h>
int dup2(int oldfd, int newfd);
//fd2 = dup2(fd1, 16);

命令行中的重定向(>)

  • Linux 中的 shell 命令执行后,打印后果都是默认进入规范输入的(因为这些命令都是调用 printf 打印的),所以咱们能够间接在 Linux 终端看到命令执行的后果。
  • 命令行中的重定向 > 的作用:

    • 将命令行中命令执行的后果指定输入到某一个文件中。
    • 例如:将 ls 命令的输入后果重定向到 1.txt 文件中去(留神是在终端命令行中输出下列命令)
    ls > 1.txt
  • 重定位命令 > 的原理就是利用 close + dup

    • open 关上文件 1.txt,而后 close 敞开 stdout(规范输入),因为规范输入的文件描述符的值是 1,而后利用 dup2 将文件描述符 1 和 1.txt 文件关联起来。
退出移动版