/*
达内学习 UC day26 2013-10-9
*/
回忆:
各种内存管理的函数 malloc()/free() C语言版
brk()/sbrk() Unix版本
mmap()/munmap() 针对物理内存映射
今天:
系统调用(system call)
Unix/Linux
文件相关的设置和函数
系统调用
内存地址空间有用户空间和内核空间之分,用户空间不能直接进入内核空间
。Unix/Linux中,很多操作都需要内核完成,Unix/Linux遵守的POSIX标准中,专门提供了一些列的函数的接口
,用于用户空间进入内核空间。这一系列函数统称系统调用
Unix/Linux系统 通过系统调用可以进入内核
用户层
进入内核层,需要先封存用户层状态,然后进入内核层,内核层处理完毕后,返回用户层,并且之前封存的状态
还原,因此 :程序不宜频繁的调用系统调用
time a.out可以察看进程在用户态和内核态的时间
文件操作
在
Linux系统中,几乎一切都做成文件,内存可以看成文件,目录可以看成文件,硬件设备可以看成文件
文件操作
函数
open() -读文件
read() -写文件
write()-写文件
close()-关闭
ioctl()-输入输出控
制 以上可以操作大多数的设备,而不只是文件
int open(char* filename,int flags,...) ...可变长参数,
就是0-n个任意类型的参数
filename 就是被打开的文件名(带路径),flags 指明打开方式 返回文件标识符号
常见的标识(flags),指明如何打开 返回文件描述符 出错返回-1
O_RDONLY O_WRONLY O_RDWR -
打开文件后的访问权限
O_CREAT - 如果文件不存在 新建,存在打开
O_EXCL - 一般和O_CREAT联合使用,不存在
新建,存在直接返回-1,(不打开文件)
O_TRUNC 一般和O_CREAT联合使用,不存在新建,存在就清空现有文
件
O_APPEND 针对写文件有效,代表用追加方式写文件
在UC中,用非负整数代表一个打开的文件。这个整数
叫做文件描述符
操作系统预先用 0 1 2 代表标准输入 标准输出 和标准错误,因此用户的文描述从3开始,到
OPEN_MAX(LINUX为256),文件描述符可以循环使用,只要close()就可以继续使用
文件描述符,代表文件的过程
1 open() 函数打开一个文件,并且把文件的相关内容(数据,状态)存入一个文件表 如果是新建文件,需要
第三个参数需要指定新建文件的权限
2 每个进程都有一张文件描述符和文件表的对应关系总表,在总表
中,每个文件表 对应 一个 整数(文件描述符)
3 从对应关系总表中,察看一下最小的没有被使用的整数
作为新打开的文件的描述符、对应新的文件表
4 把新的对应关系,存入对应关系的总表
5 close()
就是从总表中删除对应描述符和文件表
UC程序员 只接触描述符,不接触文件表
只有 在总表从对应上文件表的
整数才是文件描述符 而没有对应关系的整数,只能是整数
int read(int fd,void *buf,size_t size)
参数:fd
代表 一个打开的文件描述符
buf 一块内存的首地址
size buf的大小
返回: 》0 实际读到的字节
数
==0 都到了文件尾
-1 读文件出错
int write(int fd,void* buf,size_t
count)
参数:前两个和read()一样
count代表 准备写入的字节数
返回: > 0 实际写入的字节数
==0 没有
写入
-1 写文件出错
练习:
用UC函数实现员工信息的存储(写)和取出(读),员工信息包括: 员工
ID,员工姓名,薪水
写两个文件(reademp.c writeemp.c),定义员工的结构emp,读写 结构( 先写后读
)
关于标C文件,读写函数和UC文件读写函数
标C函数有缓冲区,UC函数在用户层没有缓冲区,因此如果频繁调用
,标C函数效率比UC函数高,但UC函数可以通过自定义缓冲区的方式提高效率
练习:
要求在写入员工信息
时候,可以直接用vi看到ID和sal
提示:
只有char* 类型才能被vi所识别, 因此:之需要把emp的ID name
sal 拼接成一个字符串,再把字符串写入文件即可(sprintf)
作业:
用UC函数实现用户的注册和登录
思路:
用户信息包含:用户名,密码,email