Unix C学习笔记9 文件的元数据,内存映射文件

文件的元数据

函数

buf为输出型参数,给谁的地址,函数将数据存到谁当中,返回值只表示成功或失败

 

 open函数预编译,第二个参数替换宏得到八进制02|0100|01000得到01120

a.out的用户为tarena,由tarena创建

a.out运行成为进程

每个进程都有一个实际用户ID,取决于当前系统登录的身份,登录用户是谁,进程的实际用户ID就是谁

每个进程都有一个有效用户ID,有效用户ID一般情况下等价于实际用户ID,若运行起该进程的可执行文件a.out拥有设置用户ID位(即B11为1),此时该进程的有效用户ID不等于实际用户ID,而是与该可执行文件a..out的拥有者身份相同

有效用户ID是谁,决定了进程对系统资源的访问能力/访问权限大小

张三创建a.out,B11设置为1,李四登录运行a.out,实际用户为李四,有效用户为张三

root创建a.out,有有效用户ID位,普通用户tarena登录运行a.out,实际用户为tarena,有效用户为root,该进程拥有root用户的权限

cd /usr/bin/passwd   rws代表拥有设置用户ID位

 

 

将st_mode放入宏中,返回真为是,返回假为否,S_ISREG(st_mode)

有设置用户ID位,有执行权限为小s,无执行权限为大S

 

 s数组为临时变量,为函数的局部成员,函数结束后s数组会释放,返回值变为野指针,通过s还能找到内存,但内存已被释放,没有所有权

让s变为静态或全局类型都能解决该问题 

 

man 3 localtime得到返回值参数为一个结构体

 内存映射文件

虚拟地址也可以往文件上映射 

向文件写hello world

MAP_SHARED:写的时候hello world直接出现在文件中

MAP_PRIVATE:写的时候hello world文件中看不到,在缓冲区中,谁来访问都看不到,完成操作才到文件中

偏移量只能以页为单位,0,4096...

 

排查错误,perror没报错,strcpy出错

 文件0字节,没有大小,拷贝不进来,所以要修改文件大小

成功拷贝

 

通过映射读写文件比较快,因为虚拟地址与文件是映射的,对虚拟地址的操作相当于对文件的操作

read/write要先把buf里的内容写到缓冲区,再写到文件,至少两次复制

read/write是专门操作文件的函数,文件大小是0没有关系,read/write会自己改变文件大小

修改文件大小,扩大4096相当于4096个空洞,strcpy再往空洞填充内容

char* buf = "123";

buf = "123456";

"123","123456"为字面值常量,存储在代码区,相当于先将常量“123”的地址给buf,又将buf指向“123456”

char buf[16] = "123";

'1','2','3','\0'

相当于将“123”存储在数组中,存了4个字节,存储“123456”存了7个字节

对文件mmap.txt来讲相当于4096个字节的存储区,start指向首地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值