欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CSAPP第十章学习日志

程序员文章站 2022-06-29 18:53:52
...

第十章:系统级I/O

一、Unix I/O

所有的I/O设备(例如网络、磁盘和终端)都被模型化为文件,而所有的输入和输出都

被当作对相应文件的读和写来执行。

1.打开文件。

2.Linux shell创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、

标准输出(描述符为1)和标准错误(描述符为2)。

3.改变当前的文件位置,对每个打开的文件保持一个文件位置k,初始为0。文件位置

即是从文件开头起始的字节偏移量。

4.读写文件。一个读操作就是从文件拷贝n>0个字节到存储器,然后将k增加到k+n。写

操作就是从存储器拷贝n个字节到一个文件,从当前文件位置k开始,然后更新k。

5.关闭文件。

二、打开和关闭文件

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

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

返回:若成功则为新文件描述符,若出错则为-1。

flags参数指明指明了进程打算如何访问这个文件:

O_RDONLY:只读。

O_WRONLY:只写。

O_RDWR:可读可写。

O_CREAT:如果文件不存在,就创建一个空文件。

O_TRUNC:如果文件存在,则清空它。

O_APPEND:每次写操作前,设置文件位置到文件结尾处。

mode指定新文件的访问权限位。

关闭文件

int close(int fd);

三、读写文件

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

read函数从描述符为fd的当前文件位置复制最多n个字节到内存位置buf。返回值-1表

示一个错误,而返回值0表示EOF。否则,返回值表示实际传送的字节数量。

write函数从内存位置buf复制最多n个字节到描述符为fd的当前文件位置。

运行代码:

#include "csapp.h"

int main(int argc, char *argv[])//argv[1]为abcde.txt(abcde)
{
	int fd1, fd2, fd3;
	char c1, c2, c3;
	char *fname = argv[1]; 
	fd1 = Open(fname, O_RDONLY, 0);
	fd2 = Open(fname, O_RDONLY, 0);
	fd3 = Open(fname, O_RDONLY, 0);
	dup2(fd2, fd3); 
	Read(fd1, &c1, 1);
	Read(fd2, &c2, 1); 
	Read(fd3, &c3, 1); 
	printf("c1 = %c, c2 = %c, c3 = %c\n", c1, c2, c3); 
	Close(fd1);
	Close(fd2); 
	Close(fd3);
	return 0}	

运行结果:

CSAPP第十章学习日志

上一篇: CSAPP学习笔记

下一篇: 学习日志