1.认识内核对象
操作系统不允许用户直接访问内核设备和内存
但允许通过内核系统函数访问
对每个内核对象进行编号ID。
如果访问内核对象(内核空间的所有数据的统称),只能通过ID
编程模型:
1)申请得到一个ID
2)在内核系统函数中使用ID得到对应内核对象。
2.怎么访问文件
使用函数,传递一个文件,系统打开文件,加载文件数据
返回一个ID。
使用函数,传递ID,得到数据。
使用函数传递ID,告诉系统释放文件。
ID:文件描述符号。file description (fd)
每个程序执行的时候都有一个目录,存放打开的文件描述符。
3.每个程序默认打开三个文件设备:
0:标准输入
1:标准输出
2:错误输出 (建议)
4.操作文件描述符号
ssize_t write (int fd,
void *buf,//要写入内核对象的数据
size_t size);//写入数据大小
ssize_t read(int fd,
void *buf;//
size_t size);
三、基于文件的描述符号
1.得到文件描述符号/释放文件描述符号
a.文件类型
目录文件d
普通文件f
字符设备文件c
块设备文件b
符号链接文件l (软连接文件)
管道文件p
socket文件s
b.文件属性
1.属性的表达方式:绝对模式,字符模式
0 0 0
拥有者 组 其它用户
2.文件的权限属性
读
写
执行
沾附位权限
设置位权限 用户设置位与组设置位
特殊权限
s 设置位 2 组 4用户 s对执行有效
S 无效的设置位
设置位向其它用户开发拥有者权限的权限用户设置位
设置位向其它用户开发组用户权限的权限组用户设置位
对其它用户有效 设置位对执行程序有意义,针对执行权限
t 1表示沾附位设置 t对写文件有意义,无效的沾附位使用T表示。
T 无效的沾附位
沾附位的目的:防止有写权限的用户删除文件 对其它用户有效
设置位改变程序在执行的时候的权限
程序执行中二个用户实际用户
2.通过文件描述符读写数据
3.文件描述符号与重定向
四、IO与文件映射
1.IO的共享与效率
read与write其中数据缓冲的大小
读取数据的缓冲:getpagesize 效率最高,经验值
2.定位与定准读取 随机读取与顺序读取
read与write在操作的时候,自动移动读取位置
lseek改变读取定位
off_t lseek(
int fd,
off_t off,
int whence//定位参照点,文件末,首,及当前位置);
返回当前文件的读写位置
lseek定位超过文件长度时,会改变文件大小
lseek只要合法,都是有效的
off 参数为负,会产生错误,返回-1
pread/pwrite 在指定位置读写 ,会改变读写位置
lseek+write=pwrite
lseek+read=pread
/proc/${pid}/mem文件程序的虚拟内存
文件的其它操作
stat命令可以查看文件信息
fstat()获取文件大小 stat结构 若出现,存储大未知错误,是未加头文件的原因
ftruncate 改变文件大小
4.文件映射
虚拟地址映射到内存
虚拟地址可以映射到文件:用内存方式访问
mmap/munmap
案例:1.使用内存方式写入数据
2.使用内存方式读取数据
1.打开文件
2.映射到一个虚拟的地址mmap
3.把数据写入虚拟地址
4.卸载虚拟地址
5.关闭文件
五、文件描述符号的操作 IO锁
文件描述符号是整数。文件描述符号对应了内核的上下文环境。
1.dup dup2拷贝文件描述符号
dup复制文件符号,返回系统指定的整数
dup2复制文件符号,返回用户指定的整数
2.fcnt1 对文件描述的属性的修改
复制文件描述符号
修改判定文件的描述标记 文件描述符的遗传方式--exec二个进程打开文件描述符的关系
修改判定文件的状态标记
设置强制锁 重新编译内核
设置建议锁 内核默认方式
设置IO信号
六.IO与Curses(介绍)终端IO
Curses CUI
UI CUI字符界面GUI图形界面
使用一套封装库 libcurses.so
/usr/lib目录下
编译只需要指定-lcurses
老版本:libcurses.so
新的版本:libnecurses.so
如果头文件 curses.h不存在,尝试,ncurses.h
如果库curses不存在,尝试使用ncurses
printf/scanf标准IO
大部分标准IO重定向到终端./dev.tty /dev/pts/1 可重定向
curses就是终端输出 不可重定向
-lcurses -ncurses 编译命令
为了防止printf重定向到终端破坏UI,禁止在curses中使用标准IO
1.编程模型:
初始化终端initscr
操作终端(输入/输出/定位/刷新……)
释放终端endwin
2.显示
2.1图形输出
border 几何图形输出
box
hline 水平线
vline 垂直线
属性字条:字节=属性字节+字符字节
注意:box需要窗体,initscr返回被初始化的窗体:标准屏幕window*
实际上curses定义一个全局变量stdscr,就是我们标准屏幕
函数命名规则:
**** 在标准屏幕strscr
w*** 在指定窗体
mv**** 在指定位置
mvw* *** 在指定窗体的指定位置操作
2.2刷新屏幕
void refresh()
void wrefresh(window*)
从里到外刷屏
2.3字符输出
addch
普通字符
属性字符:' '| 属性
特殊的属性字符:比如ACS_PI
2.4字符串输出
addstr
显示的字符属性与颜色
3.颜色属性
3.1判定终端是否支持颜色
bool has_colors(); //都支持颜色。不需要判定
3.2 初始化颜色
int start_colors();
3.3定义颜色对
int init_pair()
3.4使用颜色对
COLOUR_PAIR()
3.5设置属性
attron()开启属性
attroff()关闭属性
这组函数一定要在initscr()初始化后调用
背景函数 bkgd();
案例:
编写一个时间显示屏幕
1.初始化
2.循环显示时间,并且睡眠1秒
3.释放
编写一个登录界面
1.初始化
2.绘制界面头
3.绘制用户名输入区
4.绘制密码输入区
5.等待输入
6.结束
4.输入
4.1字符输入
getchar() 返回输入的字符
noecho禁止回显
使功能键有效,使用keypad(WINDOW *,bool)
curses屏幕清除:erase清屏clear
光标控制:
得到光标位置 getsyx
设置光标的位置 setsyx
光标控制:
得到光标位置 getsyx
设置光标的位置 setsyx
控制光标是否可见:curs_set() 0不可见1正常显示
4.2字符串输入
addstr()
mvgetnstr()
4.3格式数据输入
scanw()
4.4窗口
subwin()//创建子窗体(坐标采用标准屏幕坐标)
derwin()//创建子窗体(坐标采用父坐标)
补充:
1.在VI设置编码:
:set encoding=编码 gb2312iso-8859-1 uft-8
2.在编译器指定源文件的编码 -finput-charset=gb2313
3.在终端指定编码
终端-选择编码格式
4.系统的默认编码 /etc/sysconfig/i18n配置编码
练习:
1.使用内存方式读取数据 文件映射
2.使用curses+io完成:图书信息的录入
3.使用curses+io显示图书信息
每次显示一条
使用up down键翻滚记录数据
4.读取文件,使用curses显示。
实现如下功能:
上下翻页功能
输入q,结束功能