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型的文件描述符

文件描述符的概念:

一个运行中的程序被称为一个进程,他又一些与之相关的文件描述符,文件描述符是一些小的、正整数数值的数,通过他们可以访问打开的文件和设备。

文件描述符是打开文件的进程与文件之间的连接;

文件描述符是一个正整数的值(文件访问的一个句柄);

同时打开几个文件,描述符不相同;

一个文件打开多次,描述符也不相同。

powershell 复制代码
#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.

powershell 复制代码
#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、文件实战练习

相关推荐
Fanfanaas7 分钟前
Linux 系统编程 进程篇(一)
linux·运维·服务器·c语言·开发语言·网络·学习
念恒1230614 分钟前
ROS2入门
linux·运维·服务器
小糖学代码30 分钟前
LLM系列:1.python入门:6.元组型对象(tuple)
linux·运维·服务器·python
云淡风轻~窗明几净1 小时前
ubuntu的lazarus的Tline/TeaLine组件的构思
linux·数据库·ubuntu
小宋0011 小时前
ROS2 安装指南(Ubuntu 22.04+Humble)
linux·运维·ubuntu
Cinema KI2 小时前
有关Linux文件权限的概述
linux
发发就是发2 小时前
顺序锁(Seqlock)与RCU机制:当读写锁遇上性能瓶颈
java·linux·服务器·开发语言·jvm·驱动开发
_Emma_2 小时前
【Linux media】Linux Media Driver Framework
linux·服务器·视频
萝卜小白2 小时前
算法实习学习记录-day01
linux·服务器
cyber_两只龙宝3 小时前
【Oracle】Oracle之SQL中的单行函数
linux·运维·数据库·sql·云原生·oracle