CSAPP——系统级I/O的四种基本函数及什么叫输入输出

基本概念

首先说明一下,在Linux中一切皆文件。

  1. 一个应用程序通过要求内核打开相应的文件,来宣告它想访问一个I/O设备。内核返回一个小的非负整数,叫做描述符,它在后续所有对此文件的操作中标识此文件。
  2. Linux shell创建的每个进程开始时都有三个文件:标准输入(0)、标准输出(1)、标准错误(2)。因此用户所打开的第一个文件的描述符为3,并且以后的所有文件的描述符都是从3开始的从小到大的整数。
  3. 程序在运行期间,从外部的储存媒介或者其他程序中读入所需要的数据,这就是输入流。输入流的指向称作它的源,程序通过输入流读取源中的数据;程序在处理数据后,将处理的结果写入到永久的储存介质中或传送给其他的应用程序,就是输出流。输出流的指向称作它的目的地,程序通过输出流把数据传送到目的地;源和目的地除了可以是磁盘外,还可以是键盘、内存或显示窗口等。

1、打开文件

ssize_t

int open(char *fillename, int flags, mode_t mode);

返回:若成功则为新的文件描述符,若出错则为-1
第一个参数:文件名,函数把该文件转化为一个文件描述符返回
第二个参数:指明进程打算如何访问该文件

  • O_RDONLY:只读
  • O_WRONLY:只写
  • O_RDWR:可读可写

第三个参数:指定了新文件的访问权限位

关闭文件

int close(int fd);

返回:若成功返回则0,若出错则为-1。
参数:想关闭文件的文件描述符

读写文件

ssize_t read(int fd, void *buf, size_t n);
ssize_t write(int fd, void *buf, size_t n);

返回:成功则为读写的字节数,出错则为-1,读的时候若EOF则为0.
第一个参数:要操作的文件的文件描述符
第二个参数:读写的具体位置
第三个参数:读写的字节数
ps:ssize_t 为有符号long, size_t为无符号long。
read函数从描述符为fd的当前文件位置复制最多n和字节到内存位置buf。
write函数从内存位置buf复制至多n个字节到描述符fd的当前文件位置。
以下程序展示了使用read和write调用一次一个字节地从标准输入复制到标准输出。

/* $begin cpstdin */
#include "csapp.h"

int main(void) 
{
    char c;

    while(Read(STDIN_FILENO, &c, 1) != 0) 
	Write(STDOUT_FILENO, &c, 1);
    exit(0);
}

以下为运行结果图在这里插入图片描述
参考文献——《深入理解计算机系统》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值