IO基础

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,结束功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值