目录
- 1、系统编程介绍以及文件基本操作
- 文件编程系统调用
- 文件基本读写练习
- 2、文件描述符以及大文件拷贝
- 文件描述符
- 大文件拷贝对比试验
- 3、文件实战练习
1、系统编程介绍以及文件基本操作
系统编程是基于Linux封装好的一些函数,进行开发。
Linux文件信息属性在indoe和block的数据结构里,文件的长度和它在磁盘上的存放地点也保存在inode里。inode结构体和inode编号一一对对应。系统使用的是文件的inode编号。 ls -i 可以看到inode编号和文件名的对应情况。综上,文件结构分为inode和block两部分。
inode结构体(保存文件属性) block(报文文件内容)
用于存储文件的各属性,包括:
所有者的信息:文件的owner,group;
权限信息:read write 和excite
时间信息:建立或改变的时间(ctime)、最后读取时间(atime)、最后修改时间(mtime);
标志信息:一些flags;
内容信息:type,size,以及相应的block的位置信息。
注意:inode不记录文件名或目录名,文件名或目录名记录在文件所在目录对应的block里。
创建目录或文件:
当创建一个目录时,文件系统会为该目录分配一个inode和至少一个block,该inodejilu该目录的属性,并指向那块block,该block记录该目录下相关联文件或目录的inode编号和名字。
当创建一个文件时,文件系统会为该文件分配至少一个inode和与该文件大小相对应的数量的block。该inode记录该文件的属性,并指向block。
通过ls -i查询发现,一般情况下,目录的文件的大小都是4096byte,对应的是一个block的大小,如果一个目录中的文件数太多,以至于1个block容纳不下这么多文件时,Linux的文件系统会为该目录分配更多的block
普通文件的大小是该文件大小相对应的数量的block的Size。
文件编程系统调用
文件的系统调用接口和Stdio库文件接口在Linux系统中的位置。
文件操作是通过操作系统提供的系统调用实现对文件的创建、访问、编辑、删除等操作。
文件相关的基本系统调用如下:
open 打开一个文件来读写或创建一个空文件
creat 创建一个空文件
close 关闭以前打开的文件
read 从文件中读数据
write 写数据到文件中
/font>
可以通过man 2 open 查询系统调用的使用方法,按q退出。
文件基本读写练习
每次读取文件data的10个字节,直到读取到文件结尾,并打印出来。
2、文件描述符以及大文件拷贝
文件描述符
open的返回值是int型的文件描述符
文件描述符的概念:
一个运行中的程序被称为一个进程,他又一些与之相关的文件描述符,文件描述符是一些小的、正整数数值的数,通过他们可以访问打开的文件和设备。
文件描述符是打开文件的进程与文件之间的连接;
文件描述符是一个正整数的值(文件访问的一个句柄);
同时打开几个文件,描述符不相同;
一个文件打开多次,描述符也不相同。
#include <unistd.h>
/* Standard file descriptors*/
#define STDIN_FILENO 0 /*标准输入*/
#define STDOUT_FILEENO 1 /*标准输出*/
#define STDERR_FILENO 2 /*标准错误输出*/
open 系统调用:建立了一条到文件或设备的访问路径。功能为打开或创建文件。
O_RDONLY 只打开文件
O_WRONLY 只写打开文件。
O_RDWR 写打开文件
以下具体使用规则参见man手册
O_CREAT 按mode中出的向方式创建文件
O_EXCL 査文件是否存在(配合O_CREAT参数使用)。
O_TRUNC 强制创建文件(与O_CREAT参数配合使用时)。
O_APPEND open函数打开文件后,自动调整读写指针指向文件尾。
使用open函数在创建一个bbb文件,并指明其权限为664.
#include <stdio.h>
#include <sys/type.h>
#include <sys/stat.h>
#include <fcnt.h>
int main(int argc,char *argv[])
{
//使用open函数在桌面上创建一个bbb文件,并指明其权限为664
int fd = open("/home/hegf/Desktop/bbb",O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
printf("first create bbb fd=%d\n",fd);
//O_EXCL 检查文件是否存在(配合O_CREAT参数使用,如果文件已经存在,则返回-1)
fd = open("/home/hegf/Desktop/bbb",O_EXCL|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
printf("second create bbb fd=%d\n",fd);
return 0;
}
open与create对比练习,标准输入输出文件描述符练习
大文件拷贝对比试验
方法一:一个字节为单位进行拷贝
方法二:使用一个1024个字节的buf作为拷贝的缓存(重点掌握)