底层操作的几个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(其他用户)),这样设定就是文件所有者有读写,组用户有读,其他用户也是读。
- 底层操作的几个I/O函数
- 底层文件I/O操作---open()函数
- 底层I/O的操作过程
- [Linux]--底层文件 I/O 操作
- mpc8260的i/o操作函数
- I/O输入的几个操作的机制分析
- java I/O底层
- 小何讲Linux: 底层文件I/O操作
- [Linux]--底层文件 I/O 操作之文件锁
- [Linux]--底层文件 I/O 操作之多路复用
- Linux C 环境下不带缓冲的I/O操作函数
- 读取文件操作的标准I/O函数
- java的I/O操作
- lua的I/O操作
- C++的I/O操作
- Java的I/O操作
- Java的I/O操作
- python的I/O操作
- Javascript进阶:对象实例属性和方法
- Hibernate 针对oracle数据库配置及MS SQL的数据库配置
- 安装nginx并配置php环境
- NDK Java 调用 C/C++ (二)
- 2013 c3展,你所不知道的Ps4
- 底层操作的几个I/O函数
- (后台)Openbravo如何定义一个后台进程
- NDK C/C++ 调用 Java (三)
- 【干货分享】32本优秀的 JavaScript 免费电子书
- 静态页面中apk文件链接,被直接打开而不是下载
- 从天而降的Boss
- Ajax(3):get请求之表单中含有中文时如何处理
- 凹凸映射(Bump Map)实现原理
- 从一个字符串中删除另一个字符串中出现的字符