open

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值