基本概念
首先说明一下,在Linux中一切皆文件。
- 一个应用程序通过要求内核打开相应的文件,来宣告它想访问一个I/O设备。内核返回一个小的非负整数,叫做描述符,它在后续所有对此文件的操作中标识此文件。
- Linux shell创建的每个进程开始时都有三个文件:标准输入(0)、标准输出(1)、标准错误(2)。因此用户所打开的第一个文件的描述符为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);
}
以下为运行结果图
参考文献——《深入理解计算机系统》