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、文件实战练习

相关推荐
Two_brushes.37 分钟前
【linux网络】网络编程全流程详解:从套接字基础到 UDP/TCP 通信实战
linux·开发语言·网络·tcp/udp
夕泠爱吃糖1 小时前
Linux中的静态库和动态库
linux·运维·服务器
比奥利奥还傲.2 小时前
Linux运维安全新范式:基于TCPIP与SSH密钥的无密码认证实战
linux·运维·安全
果子⌂3 小时前
容器技术入门之Docker环境部署
linux·运维·docker
深度学习04074 小时前
【Linux服务器】-安装ftp与sftp服务
linux·运维·服务器
iteye_99395 小时前
让 3 个线程串行的几种方式
java·linux
渡我白衣6 小时前
Linux操作系统:再谈虚拟地址空间
linux
阿巴~阿巴~6 小时前
Linux 第一个系统程序 - 进度条
linux·服务器·bash
DIY机器人工房6 小时前
代码详细注释:通过stat()和lstat()系统调用获取文件的详细属性信息
linux·嵌入式
望获linux7 小时前
【Linux基础知识系列】第四十三篇 - 基础正则表达式与 grep/sed
linux·运维·服务器·开发语言·前端·操作系统·嵌入式软件