回顾:
Unix/Linux内存管理 - sbrk()、brk()
一般用sbrk()分配内存,brk()回收内存
底层维护了一个位置,以1个内存页为基本单位
mmap()/munmap()
虚拟内存地址和物理内存/硬盘文件 做映射
映射以后 虚拟内存地址才能被用来存储数据
基本的文件操作- open() close() read() write()
今天:
练习:
把员工信息写入文件,要求用cat/vi能看清楚信息
提示:只有字符串类型才能被vi看清楚。
把员工信息拼接成一个很长的字符串再写入文件
sprintf() 和printf() fprintf() 用法基本一样
关于标C函数和Uc函数的区别:
标C函数 都有 输入/输出缓冲区,而Uc函数在用户层是没有缓冲区,因此,频繁输入输出时,Uc函数最好自定义一个缓冲区(char buf[])。
如果对于性能没有特殊的要求,使用标C函数即可,有特殊要求,使用UC函数更好。
dup()和dup2()都可以复制文件描述符,区别是:
dup()返回的是 系统帮忙查找的 未使用的最小值
dup2()返回的是 第二个参数,如果该值已经被使用,会先 关闭 然后再使用。
dup() dup2() 复制文件描述符,但不复制对应的文件表。
使用文件描述符时,内存中对应一个文件表,在文件表中,会记录 关于内存中文件表的信息和硬盘上的文件的信息,其中,i节点 是文件在 硬盘上的 地址。
lseek() 是 fseek()的底层实现,是系统调用。
第一个参数 是 fd
第二个参数 是 偏移量
第三个参数 是 偏移的起始位置,有3种选择:
SEEK_SET - 从文件头开始
SEEK_CUR - 从当前位置开始
SEEK_END - 从文件尾开始
开发中,更多使用 SEEK_SET。
fcntl()用法:
fcntl(int fd,int cmd,...)
1 可以复制文件描述符 (cmd取F_DUPFD)
2 可以获取/设置文件的状态(cmd取F_GETFL/SET)
3 实现文件锁(cmd取F_SETLK/F_GETLK/F_SETLKW)
当复制文件描述符时,和dup2类似,不同点:
a 不会强制关闭已经使用的描述符
b 返回值是大于等于 第三个参数
获取/设置文件状态时,创建文件的标识不能获取也不能设置(O_CREAT/O_TRUNC/O_EXCL),文件的访问权限标识不能修改。
经验:
位与运算 经常用于 取某一位二进制的值和取某几位二进制的值。比如:取a的最后8位二进制:
a&0xFF
最大int:0x7FFFFFFF,最小int:0x80000000
16进制 是二进制的 简写,4位合成 1位。
文件锁 - 用来锁定对文件的读写操作
现在主流的锁都是 读写锁,由两种锁组成:
1 读锁 是共享锁,锁定写操作,允许读操作,用于读文件。
2 写锁 是独占锁,锁定其他进程的操作(无论读写)
作业:
用 今天的函数实现 用户登录。
增强字符串 相关知识。
用 今天的函数实现 用户登录。
增强字符串 相关知识。