香奈儿网站建设策划书怎么做网站的域名解析
web/
2025/10/5 1:01:39/
文章来源:
香奈儿网站建设策划书,怎么做网站的域名解析,热门网站建设加盟平台,广西北海联友建设网站管理3. 深入探究文件 IO 1. Linux 系统如何管理文件1.1 静态文件与inode1.2 文件打开时的状态 2. 返回错误处理与errno2.1 strerror 函数2.2 perror 函数 3. 空洞文件4. O_APPEND 和 O_TRUNC5. 多次打开同一个文件6. 复制文件描述符6.1 dup6.2 dup2 7. 文件共享7.1 同一个进程中多次… 3. 深入探究文件 IO 1. Linux 系统如何管理文件1.1 静态文件与inode1.2 文件打开时的状态 2. 返回错误处理与errno2.1 strerror 函数2.2 perror 函数 3. 空洞文件4. O_APPEND 和 O_TRUNC5. 多次打开同一个文件6. 复制文件描述符6.1 dup6.2 dup2 7. 文件共享7.1 同一个进程中多次调用 open 函数打开同一个文件7.2 不同进程分别使用 open 函数打开同一个文件7.3 同一个进程中对文件描述符进行复制 8. 原子操作与竞争冒险8.1 O_APPEND8.2 pread 和 pwrite8.3 创建一个文件 9. fcntl 和 ioctl9.1 fcntl9.2 ioctl 10. 截断文件 1. Linux 系统如何管理文件
1.1 静态文件与inode
文件没有被打开的情况下一般都是存放在磁盘中的并且以一种固定的形式进行存放这时称为静态文件。文件存储在硬盘上硬盘的最小存储单元叫做扇区每个扇区大小是 512 字节 相当于 0.5k。操作系统读取硬盘的时候不会一个个扇区的读取而是一次读取多个扇区也就是一个块 通常是 4k也就是 8 个扇区。将磁盘进行分区格式化的时候会分为数据区和 inode 区inode 区存放 inode 表该表中存放着 inode 节点每个节点都是一个结构体包含着对应文件的属性信息。所以查找文件时先根据文件名找到对应的 inode 编号然后找到对应的表最后查找相关信息读取数据。
1.2 文件打开时的状态
调用 open 打开文件的时候内核会申请一段内存将数据读取到内存中进行管理也就是动态文件。对动态文件进行读写操作时和静态文件不会同步数据的同步由内核完成内核会在之后将内存这份动态文件同步到磁盘中。静态文件有多个块一个块有多个扇区一个扇区有多个字节所以对静态文件操作时需要反复读写块而内存可以直接一个字节一个字节的改动所以速率较快。 在 Linux 系统中内核会有一个专门的数据结构管理一个进程叫做 PCB。该结构体中有一个指针指向了文件描述符表而文件描述符表中的每一个元素对应文件表文件表存放着文件的相关信息。
2. 返回错误处理与errno
当发生错误时操作系统会将错误对应的编号赋值给 errno 变量每个进程都有一个自己的 errno 全局变量
2.1 strerror 函数
#include string.h
char *strerror(int errnum); // 参数就是对应的errno返回对应错误编号的字符串描述信息2.2 perror 函数
#include stdio.h
void perror(const char *s); // 参数可以传递自己想要的信息然后错误描述就会打印在s之后3. 空洞文件
lseek 函数还允许文件偏移量超出文件长度也就是文件末尾还可以向后偏移。比如一个文件只有 4096k此时在文件头部向后偏移 6000 字节然后在这里写入数据那么 4096 ~ 6000 这部分就是空洞。文件空洞部分不会占用任何物理空间但是空洞文件形成时逻辑上该文件的大小是包含了空洞部分的大小的。 文件空洞在多线程共同操作文件时有很大作用可以将文件分段不同线程在不同空洞部分写入数据。
4. O_APPEND 和 O_TRUNC
O_TRUNC 会将文件原本的内容清除然后再写入数据而O_APPEND 是在文件末尾写入数据。
5. 多次打开同一个文件
一个进程内多次打开一个文件那么会得到多个不同的文件描述符同理在关闭的时候需要依次关闭对应的文件描述符。而且在内存中不会存在多份动态文件不同文件描述符对应的读写位置偏移量是相互独立的。因为位置偏移量是相互独立的所以对不同的文件描述符读写时是分别进行读写。使用 open 函数打开文件时默认是覆盖式写入也就是说当分别进行写入操作时后续写入数据时会先将文件清空再写入。 不同的文件描述符就对应不同的文件表而位置偏移量就保存在文件表中但是文件表中的 inode 指针指向的都是同一个 inode。 同样多个不同的进程打开同一个文件在内存中也只是维护一份动态文件多个进程间共享有各自独立的文件读写位置偏移量。当文件的引用计数为 0 时系统会自动关闭文件。
6. 复制文件描述符
在 Linux 系统中open 得到的文件描述符可以进行复制新的文件描述符也可以对旧文件描述符指向的文件进行操作拥有相同的权限。但是新的文件描述符和旧的文件描述符指向的文件表是同一个
6.1 dup
#include unistd.h
int dup(int oldfd); // 成功返回由系统分配的新的文件描述符失败返回-1#include stdio.h
#include iostream
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include unistd.h
using namespace std;int main()
{int fd1open(./text.txt,O_CREAT|O_RDWR,0777);int fd2dup(fd1);write(fd1,hello ,6);write(fd2,world!,6);return 0;
}6.2 dup2
#include unistd.h
int dup2(int oldfd,int newfd); // 成功返回newfd失败返回-1int main()
{int fd1open(./text.txt,O_CREAT|O_RDWR,0777);int fd2dup2(fd1,9); // 可以指定文件描述符write(fd1,hello ,6);write(fd2,world!,6);cout fd2endl;return 0;
}7. 文件共享
7.1 同一个进程中多次调用 open 函数打开同一个文件 会得到同一个文件的不同文件描述符并且多个文件描述符对应多个不同的文件表所有的文件表指向同一个 inode 节点
7.2 不同进程分别使用 open 函数打开同一个文件 7.3 同一个进程中对文件描述符进行复制 8. 原子操作与竞争冒险
当两个独立的进程对同一个文件进行操作时因为此时文件是共享的如果当一个进程的操作未完成时另一个进程就对文件进行操作就会发生竞争冒险。所以就有了原子操作。原子操作是指一个任务要么不做要么做完。 O_APPEND、pread() 和 pwrite()、创建文件都是可以实验原子操作的。
8.1 O_APPEND
两个进程都向文件中写入数据后一个进程会覆盖前一个进程写入的内容就需要使用该标志
8.2 pread 和 pwrite
这两个函数可传入一个位置偏移量用于指定文件当前读写的位置偏移量。但是不更新文件表中当前位置偏移量就是说在当前位置 0 调用这两个函数时如果设置 offset 为1024然后再调用 lseek 获取当前位置发现依旧是 0
#include unistd.h
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);8.3 创建一个文件
如果两个进程都会创建同一个文件就需要使用 O_EXCL如果要打开的文件已经存在就 open 失败如果不存在就创建这个文件
9. fcntl 和 ioctl
9.1 fcntl
fcntl 函数可以对一个已经打开的文件描述符执行一系列控制操作
#include unistd.h
#include fcntl.h
int fcntl(int fd, int cmd,.../* arg */);
/* cmd:操作命令表示我们将对fd进行什么操作* F_DUPFD 或 F_DUPFD_CLOEXEC :复制文件描述符* F_GETFD 或 F_SETFD :获取/设置文件描述符标志* F_GETFL 或 F_SETFL :获取/设置文件状态标志* F_GETOWN 或 F_SETOWN :获取/设置异步IO所有权* F_GETLK 或 F_SETLK :获取/设置记录锁* /
// 第三个参数根据cmd来传入对应的实参
// 返回值是失败返回-1成功根据cmd有不同的返回值复制文件描述符 int main()
{int fd1open(./test.txt,O_CREAT|O_RDONLY,0777);int fd2fcntl(fd1,F_DUPFD,0);// 如果传入的第三个参数已经被使用就返回一个比0大的可使用的文件描述符否则就返回第三个参数cout fd2 endl;return 0;
}获取/设置文件状态标志 int main()
{int fd1open(./test.txt,O_CREAT|O_RDWR,0777);int flagfcntl(fd,F_GETFL);int fd2fcntl(fd1,F_SETFL,flag|O_APPEND);cout fd2 endl;return 0;
}F_GETFL 成功时返回状态标志F_SETFL 的第三个参数表示需要设置的状态标志。但是文件权限标志O_RDONLY、 O_WRONLY、 O_RDWR以及文件创建标志O_CREAT、O_EXCL、 O_NOCTTY、 O_TRUNC不能被设置只有 O_APPEND、 O_ASYNC、O_DIRECT、 O_NOATIME 以及 O_NONBLOCK 这些标志可以被修改
9.2 ioctl
可以认为是文件 IO 操作的杂物箱一般用于操作特殊文件或硬件外设比如获取 LCD 相关信息等这里只是介绍以下
#include sys/ioctl.h
int ioctl(int fd, unsigned long request,...);
// request 表示向文件描述符请求相应的操作第三个可变参数根据request设置10. 截断文件
使用系统调用 truncate() 或 ftruncate()可将普通文件截断为指定字节长度
#include unistd.h
#include sys/types.h
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);// 使用前必须open并且有可写权限先创建两个文件这时文件大小都是0字节 向文件中插入数据改变文件大小 int main()
{int fd1open(./file1,O_RDWR);char buffer1[4096]{0};char buffer2[2048]{0};write(fd1,buffer1,sizeof(buffer1));write(open(./file2,O_RDWR),buffer2,sizeof(buffer2));return 0;
}截断文件发现文件大小改变了 int main()
{int fd1open(./file1,O_RDWR);char buffer1[4096]{0};char buffer2[2048]{0};write(fd1,buffer1,sizeof(buffer1));write(open(./file2,O_RDWR),buffer2,sizeof(buffer2));ftruncate(fd1,1024);truncate(./file2,2048);return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87071.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!