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;
}
运行结果: