cpu为什么要使用虚拟地址空间与物理地址空间映射?解决了什么问题
- 1.方便编译器和操作系统安排程序的地址分布
程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区 - 2.方便进程之间隔离
不同进程使用的虚拟地址彼此隔离.一个进程中的代码无法更改正在由另一进程使用的物理内存 - 3.方便OS使用你那渴念的内存
程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区.当物理内存的供应量变小时.
内存管理器会将物理内存页(通常大小为4KB)保存到磁盘问你件.数据或代码也会根据需要在物理内存与磁盘之间移动
查看man
man man
我们要查看的是第2个章节的内容 系统调用(内核提供的函数)
查看open 函数 : man 2 open
这个open包含了三个头文件,
查看man文档的时候,会见到很多模式的数据类型,unix操作系统很早就有了,C语言当时还是没有的,所以unix是有自己的数据类型的.
这个errno定义在errno.h中 : /usr/include/errno.h
第1 - 34 个错误定义在 /usr/include/asm-generic/errno-base.h 中
第 35 - 133 个错误定义在 /usr/include/asm-generic/errno.h中
errno 是一个全局变量
可以使用perror 去读取这个错误信息
open() 函数
#include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <unistd.h>
5 #include <stdlib.h>
6 #include <stdio.h>
7
8
9 int main()
10 {
11 int fd;
12 // 打开已经存在饿文件
13 fd = open("print_where.c", O_RDWR);
14
15 if (fd == -1)
16 {
17 perror("open file");
18 exit(1);
19 }
20
// 创建新文件 -- O_CREAT 要跟 O_EXCL 一起使用才能判断文件是否存在
24 fd = open("myhello", O_RDWR | O_CREAT | O_EXCL, 0777);
25
26 // 判断文件是否存在
27 if (fd == -1)
28 {
29 perror("open file");
30 exit(1);
31 }
32 printf("fd = %d\n", fd);
30
31
32 // 关闭文件
33 int ret = close(fd);
34 printf("ret = %d\n", ret);
35 if (ret == -1)
36 {
37 perror("close");
38 exit(1);
39 }
40 // printf("Hello world\n");
41 return 0;
42 }
使用O_CREAT时:
文件权限: 本地有一个掩码
文件的实际权限: 给定的权限需要与本地的掩码取反做一个按位与的操作,得到的权限才是一个实际的权限
111111111 (777 的二进制)
111111101 (000000010 取反)
得到的结果
111111101 ==== 775
所以在你创建文件的时候需要参考本地的掩码,这也是linux操作系统对文件的保护机制
这个掩码umask是可以修改的 ==== umask 003 (临时修改)
将文件截断为0
// 将文件截断为0
36 fd = open("myhello", O_RDWR | O_TRUNC);
37 if (fd == -1)
38 {
39 perror("open file");
40 exit(1);
41 }
42 printf("fd = %d\n", fd);