在学习C语言时我们接触过基础IO:输入/输出:fclose、fseek、fread、fwrite(为带缓冲的IO)等。
首先,我们应该知道在linux系统下,一切皆文件。普通文件、目录、字符设备、块设备和网络设备(套接字)都被当做文件来处理,所以对文件的操作,就提供了一套统一的接口来实现文件IO。
下面和大家看一下Linux系统中的文件IO:即打开文件、读文件、写文件。在linux系统中,实现这些操作我们主要使用5个函数:open、read、write、lseek、close。这些函数也被成为不带缓冲的IO。
既然linux下一切皆文件,那么就会有描述这些文件的信息:文件描述符。文件描述符是一个非负整数。当打开或创建一个文件时,内核将会向进程返回一个描述符。对文件进行IO操作使用接口时,也要将其作为参数传递给这些接口。文件描述符的变化范围是0~OPEN_MAX-1。而文件描述符的分配规则是寻找最小的未使用的下标。当一个进程运行起来之后,按照惯例,默认打开了三个文件:0与进程的标准输入关联,1与进程的标准输出关联,2与进程的标准错误关联。
- open:在Linux下用man手册查open接口的用法。其中参数 1.pathname是要打开或创建的文件的名字 2.flags参数是有多个常量可供选择的:(只读打开O_RDONLY; 只写打开O_WRONLY; 读写打开O_RDWR)是必须选择其中一个的,还有几个常量是可供选择的:O_CREAT文件不存在则创建,存在则打开;O_EXCL与O_CREAT同用,若文件存在则报错; O_TRUNC:打开文件的同时,清空原有内容等等可以选择的,当需要多个常量进行修饰是用“或”运算。 3.mode是创建一个文件时使用的,代表文件权限。 函数返回的文件描述符一定是最小的未用描述符数值。
- read:当read成功时,则返回独到的字节数;若已到文件末尾,返回0;若出错,返回-1。
- lseek:显式地为一个打开文件设置偏移量(按照系统默认,当打开一个文件没有指定O_APPEND选项时,文件偏移量为0)。
重定向:dup2原理:将原本描述符所对应的下标文件另一个文件的描述符,经常用来重定向进程的stdin、stdout、stderr。用newfd参数指定新描述符的值,若newfd已经打开,则先将其关闭;若oldfd等于newfd,则不关闭。