Linux系统编程-文件

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作为拷贝的缓存(重点掌握)

3、文件实战练习

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值