25.12.27 理解文件本质+文件系统调用接口+fd+重定向

文章目录

  • [1. 理解文件](#1. 理解文件)
  • [2. 系统调用接口](#2. 系统调用接口)
  • [3. 理解fd](#3. 理解fd)

1. 理解文件

文件 = 文件属性 + 文件内容

文件系统包括了加载到内存中的文件和保存在磁盘中的文件两大类

重点谈加载到内存中的文件:

根据冯诺依曼体系->文件从磁盘中加载到内存缓冲区中,等待CPU执行,这个过程由进程进行文件操作

而在代码中的体现:

研究打开的文件,本质是研究进程和文件之间的关系

2. 系统调用接口

cpp 复制代码
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>

int open(const char* pathname, int flags, mode_t mode);
  • pathname:文件路径名
  • flags:标志位,位图->32个bit位,有几个常见的宏
    • O_RDONLY:只读
    • O_WRONLY:只写
    • O_RWDWR:读写
    • O_CREAT:新建
    • O_APPEND:追加
    • O_TRUNC:清空
  • mode:设置文件权限,设置的权限要&(~umask)
cpp 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
  open("log.txt",O_TRUNC | O_RDWR, 666); // 清空+读写
  return 0;
}
bash 复制代码
[vect@VM-0-11-centos file]$ cat log.txt
hghhssladj
sajldjas
asld
[vect@VM-0-11-centos file]$ gcc open.c
[vect@VM-0-11-centos file]$ ./a.out 
[vect@VM-0-11-centos file]$ cat log.txt 
[vect@VM-0-11-centos file]$ 

写操作:

读操作:

关闭操作:

C的文件操作函数都是基于这四个系统调用接口封装的

3. 理解fd

文件描述符->本质是数组索引

文件加载到内存中需要管理->需要管理文件属性和文件内容->怎么管理?->先描述,再组织!

fd分配原则: 进程启动默认打开三个文件流:stdin stdout stderr 索引依次为1 2 3,新打开的文件按照未分配最小的索引开始,依次按照文件打开顺序递增分配

这里涉及到重定向:

使用dup2完成重定向

cpp 复制代码
#include <unistd.h>
int dup2(int oldfd, int newfd);

这句话的意思是newfd是oldfd的拷贝,所以重定向到newfd

cpp 复制代码
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(){
  int fd1 = open("log1.txt",O_CREAT | O_RDWR,0666);
  int fd2 = open("log2.txt",O_RDWR | O_CREAT,0666);
  int fd3 = open("log3.txt",O_RDWR | O_CREAT,0666);

  dup2(fd1,1);
  printf("%d\n",fd1);
  printf("%d\n",fd2);
  printf("%d\n",fd3);

}
bash 复制代码
[vect@VM-0-11-centos file]$ gcc dup2.c 
[vect@VM-0-11-centos file]$ ls
a.out  dup2.c  log.txt  open.c  proc.c
[vect@VM-0-11-centos file]$ ./a.out 
[vect@VM-0-11-centos file]$ ls
a.out  dup2.c  log1.txt  log2.txt  log3.txt  log.txt  open.c  proc.c
[vect@VM-0-11-centos file]$ cat log1.txt 
3
4
5

本来应该输出到显示器,但是重定向输出到文件里了

相关推荐
未济4 天前
linux 配置环境变量
linux
傲世仙尊4 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
_艾伦 耶格尔.4 天前
进程间通信
linux
Liuqy-054 天前
Linux IO编程——静态库、动态库
linux
彧azz4 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅4 天前
linux(8) 软硬链接
linux·运维·服务器
AIgorithmGEEK4 天前
[Linux]线程三部曲(上):一个执行流的诞生——从操作系统一路拆到 pthread_create
linux·线程·pid
琥珀色糖4 天前
SimlpeHttp
linux·服务器
qeen874 天前
【Linux】操作系统之进程介绍(二)
linux·笔记·学习·进程
Zenova EdgeOS4 天前
Linux ss 工业边缘网络分析实战
linux·python·边缘计算·工业网关