CSAPP Note chap10

这篇博客详细介绍了Unix系统级I/O,包括文件操作如open()、close()、read、write,以及RIO库中的rio_readn。还讨论了文件共享、重定向、C标准I/O,并提供了使用I/O的建议,强调Unix I/O的异步信号安全特性。
摘要由CSDN通过智能技术生成

CSAPP Note chap10

CSAPP 读书笔记系列chap10

chap 10 系统级IO

这一次说的是I/O,先说明大概,也就是 Unix I/O 和其他 I/O 的关系。

其结构如下:

IO之间的关系

图中底层是Unix I/O,通过系统调用来进行文件操作,
- Unix I/O,例如:

  • 打开和关闭 :open, close
  • 读和写:write, read
  • 改变访问顺序:lseek
  • 文件信息 stat

在这之上是 C 的标准 I/O 库,其为基于Unix I/O 实现的,
一些对应的函数为:
- C standard I/O :
- fopen, fdopen, fread, fwrite, fscanf, fprintf, sscanf, sprintf, fgets, fputs, fflush, fseek, fclose等

  • RIO 是专为本书开发的read和write的函数,也为基于Unix I/O 实现

    • rio_readn,rio_writen, rio_readlineb 和 rio_readnb

    Unix I/O

Unix I/O 是最通用最底层的 I/O 方法,其他的 I/O 包都是在 Unix I/O 的基础上进行构建的.

在 Linux 中,一切皆文件,文件实际上可以看做是字节的序列。

### 文件

为了区别Linux中不同文件的类型,会有一个 类型type 来进行区别:

  • 普通文件:包含任意数据

    • 二进制文件和文本文件对内核而言没有区别
    • 文本文件: 只含ASCII或Unicode编码的文件
    • 二进制文件: 所以其他文件
  • 目录:相关一组文件的索引

  • 套接字 Socket:和另一台机器上的进程通信的类型

其实还有一些比较特别的类型,不深入了解:

  • 命名管道Named pipes(FIFOs)
  • 符号链接Symbolic links
  • 字符及设备Character and block devices

文件操作

打开文件open()

函数原型

#include <fcntl.h>
int open(char *name ,int flags, int perms);

参数的定义可以看K&R的第八章Unix系统接口或man 2 open
例如:

int fd; // 文件描述符 file descriptor
if ((fd = open("/etc/hosts", O_RDONLY)) < 0)
{
    perror("open");
    exit(1);
}

返回值是一个小的整型称为文件描述符(file descriptor),如果这个值等于 -1 则说明发生了错误。每个由 Linux shell 创建的进程都会默认打开三个文件(注意这里的文件概念):

  • 0: standard input(stdin)
  • 1: standard output(stdout)
  • 2: standar erro
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值