底层操作的几个I/O函数

来源:互联网 发布:知乎我是歌手林俊杰 编辑:程序博客网 时间:2024/06/06 09:41

linux中的文件主要分为四种:普通文件,目录文件,链接文件,设备文件。将目录和设备当成文件处理能够提高linux的效率,内核如何区分和引用特定的文件,就需要使用文件描述符

文件描述符--------它是一个非负的整数,它是一个索引值,指向内核中进程打开文件的记录表,当打开一个文件或者创建一个新文件时,内核就向进程返回一个文件描述符,当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。

文件描述符是实现某些文件I/O操作的唯一途径,如linux低级文件操作,多路I/O,TCP/IP编程接口等,可见文件描述符很有用

ps:一个进程启动时会打开三个文件:标准输入,标准输出,标准出错,这三个文件对应的文件描述符为0(STDIN_FILENO),1(STDOUT_FILENO),2(STDERR_FILENO)

底层I/O操作涉及5个函数open(), read(), write(), lseek(), close()这些函数不带缓存,直接对文件进行操作,

open()-------用于打开或创建文件,打开或创建一个文件可以指定文件的属性级用户的权限等各种参数

close()-------关闭一个进程打开的文件,不过在进程终止时会自动关闭打开的文件,所以有时无需显示的调用这个函数

read()--------从指定的文件操作符中读出数据到缓冲区中,并返回读取的字节数,读操作从文件的当前指针开始,从设备文件中读取时,一次最多读取一行。

write()--------从当前指针开始向已经打开了的文件写数据

lseek()------定位文件指针,不过只能定位可以随机访问文件,不能定位管道,套接字,大部分的字符设备等。

open()函数语法:



ps:对于flags中的参数中的O_RDONLY,O_WRONLY,ORDWR不能同时指定,perms中的参数既能使用宏定义也能使用八进制指定

**********************************************

close()函数语法:


*********************************************

read()函数语法:


ps:如果读取指定字节之前到达文件末尾了,则返回的字节数将会小于指定的字节数

*****************************************

write()函数语法:


*************************************************

lseek()函数语法:


***************************************

这里有个程序

#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#define BUFFER_SIZE 1024//每次读写缓存的大小#define SRC_FILE_NAME "src_file"//源文件名#define DEST_FILE_NAME "dest_file"//目标文件名#define OFFSE 10240//复制数据的大小int main(){    int src_file, dest_file ;    unsigned char buff[BUFFER_SIZE] ;    int real_read_len ;    src_file = open(SRC_FILE_NAME, O_RDONLY) ;//以只读方式打开源文件,返回文件描述符    /*以只写方式打开,如果没有将会创建一个文件,创建文件的所有者为读,写权限,其他用户为读权限*/    dest_file = open(DEST_FILE_NAME, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IROTH) ;     if (src_file < 0||dest_file<0)     {          printf("open file error\n") ; exit(1) ;     }     lseek(src_file, -OFFSE, SEEK_END) ;//SEEK_END为文件的末尾,-OFFSE指离文件末尾10k的距离    /*读取10k大小,每次读取1k的数据到缓冲区buff中,循环读取,如果读取的指针到达了文件的末尾,将会返回0*/    while((real_read_len = read(src_file, buff, sizeof(buff)))>0)    {        write(dest_file, buff, real_read_len) ;    }    close(dest_file) ;    close(src_file) ;}

文件运行结果为:


可以看一下文件ls -l dest_file


正如我们上面指定的权限

ps:open()函数会返回最小的未用的文件描述符,由于当一个进程启动时会自动打开文件描述符为0, 1,2的文件,所以此处会返回3,如果在open()函数之前调用close(0);将会返回0,这个文件描述符容易与文件权限混淆(0:没有权限1:可执行权限2:可写权限4:可读权限),加起来就是文件权限,如644,设定方式为(u(文件所有者), g(组用户), o(其他用户)),这样设定就是文件所有者有读写,组用户有读,其他用户也是读。


原创粉丝点击