文件I/O编程,是对一个文件打开、读写、关闭,即对一个文件进行相应读写的操作。简单地文件编程主要用到的函数有:open read write close lseek,如果要对一些文件的属性进行操作,还可以用到fcntl和ioctl函数。

    文件描述符:对于Linux内核,所有打卡的文件都是通过引用文件描述符。文件描述符就是一个非负的整数,当打开一个文件或者创建一个文件时,内核会向进程返回该文件的文件描述符。简单点说就是这个文件描述符就代表这个文件,对文件的读写操作都是通过这个文件描述符fd作为参数来执行的。当一个进程运行时,系统默认自动打开3个文件描述符:标准输入: 0 (STDIN_FILENO);标准输出:1(STDIN_FILENO);错误输出:2(STDERR_FILENO)。当打开或创建一个文件时,文件描述符为一个最小的未使用的描述符数值。

    打开/创建文件:用到的函数原型Linux文件I/O编程(一)_Linuxopen函数是一个可变参函数,如果是创建一个新的文件,需要用3个参数;如果是打开一个已经存在的文件,则需要两个参数。

第一个参数为要打开/创建的文件名,第二个参数是权限,必须要有O_RDWR(可读可写)、O_RDONLY(只读)、O_WRONLY(只写)等三个中的一个,而还有其他参数可选,根据实际需要选择(这里只举出常用的几个):

*O_APPEND:表示追加。如果文件已经有内容,打开文件写入的数据就会接着文件的末尾,而不覆盖文件原来的内容。

O_CREAT: 表示创建文件,如果文件不存在就创建,如果文件已经存在,就保留文件(需要三个参数时使用)
*EXCL:如果同时指定了O_CREAT
* O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。
* O_TRUNC 如果文件已存在,并且以只写或可读可写方式打开,则将其长度截断(Truncate)为0字节。
* O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞

第三个参数用来创建时指定文件权限,如0777,指定的这个权限并不是文件的最终权限,文件最终权限为该指定权限mode&~umask得来。

        读写文件:用到函数原型为

Linux文件I/O编程(一)_Linux_02

Linux文件I/O编程(一)_write_03

第一个参数是open返回的文件描述符,即需要对哪个文件进行操作就填哪个文件描述符。第二个参数是一个指针变量,用来保存read读出的内容,或者要write的内容。关于返回值,read函数如果失败就返回-1,成功就返回读到的字节数,但是读到文件末尾时,会返回一个0。

    关闭文件,用close函数,关闭该文件描述符,并刷新缓冲区,释放fd。当进程结束时,系统会自动检测没有关闭的文件描述符,然后调用close将其关闭,但是为了防止程序长时间运行时占用系统资源,最后还是将不需要使用的文件描述符close一下。

    lseek函数:对文件操作指针进行修改。具体用法和常用案例另外讨论。

例:创建一个文件,从终端对文件写入内容,然后再将文件内容写到Linux文件I/O编程(一)_write_04