文件的元数据
函数
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指向首地址