linux高级编程day04 笔记***
posted on 2012-12-31 15:30 鑫龙阅读(207) 评论(0) 编辑收藏引用所属分类: 杨强linux**笔记系列
一。io与文件映射。
的共享与效率。
read与write其中数据缓冲的大小。
读取数据的缓冲大小:getpagesize。
2.定位与定位读取(随机读取)
read与write在操作的时候,自动移动读取位置。
lseek改变读取位置。
pread/pwrite在指定位置读写。
的函数说明:
off_t lseek(
int fd,//定位文件描述符号。
off_t off,//定位位置。
int whence//定位参照点:文件开始位置/文件结束位置/文件当前位置。
/seek_set seek_end seek_cur
返回:返回当前读取位置在文件中的绝对位置。
的作用:定位文件的位置。
问题:lseek的定位的位置超出文件的大小范围?
lseek移动位置只要合法,都是有效。
lseek+read =pread
#include <
#include <
#include <
main()
int fd;
float score;
int r;
int i=0;
fd=open(""o_rdwr);
if(fd==-1) printf("open error:%m"),exit(-1);/定位。
for(i=0;i<2;i++)
r=lseek(fd,i*28,seek_set);
r=lseek(fd,24,seek_cur);
/r=lseek(fd,i*28+24,seek_set);
/读取。r=read(fd,&score,sizeof(float));
/打印输出。
printf("%2f",score);
r=lseek(fd,-100,seek_set);
printf("%d",r);
/write(fd,"hello",5);
for(i=0;i<2;i++)
pread(fd,&score,sizeof(float),i*28+24);
printf("%2f",score);
read(fd,&score,sizeof(float));
printf("%2f",score);
close(fd);
2.4.案例:
读取一个特殊的文件:
proc/$/mem文件程序的虚拟内存文件。
#include <
#include <
#include <
int a=9999;
main()
char filename[100];
int fd;
int data=8888;
/得到文件名。
sprintf(filename,"/proc/%d/mem",getpid())
/打开文件。
fd=open(filename,o_rdwr);
if(fd==-1) printf("open error:%m"),exit(-1);
/读取a地址这个位置的数据。
/pread(fd,&data,4,(int)&a);
/lseek(fd,(int)&a,seek_set);
/read(fd,&data,4);
/write(fd,&data,4);
pwrite(fd,&data,4,(int)&a);
printf("%d",a);
close(fd);
3.文件的其他操作。
fstat获取文件状态。
ftruncate改变文件大小。
#include <
#include <
#include <
#include <
#include main()
int fd;
struct stat st;
fd=open(""o_rdonly);
if(fd==-1) printf("err:%m"),exit(-1);
fstat(fd,&st);
printf("%d,%
o",close(fd);
4.文件映射:
虚拟地址映射到内存。
虚拟地址可以映射到文件:可以用内存方式访问文件。
mmap/munmap
案例:1.使用内存方式写入数据
#include <>
#include <>
#include <>
#include <>
#include
#include <>
#include
struct stu
char name[20];
int age;
float score;
main()
int fd;
struct stu *s;//文件在虚拟内存的映射首地址。
struct stat st;
int size;//文件大小。
int count;//记录条数。
int i;
/1.打开文件。
fd=open(""o_rdwr|o_creat|o_excl,0666);
if(fd==-1)
fd=open(""o_rdwr);
if(fd==-1) printf(":m"),exit(-1);
/2.得到文件大小,文件记录条数。
fstat(fd,&st);
size=count=size/sizeof(struct stu);
/3.文件大小改变只要在munmap之前调用都有效
/ftruncate(fd,size+sizeof(struct stu));
/4.映射到一个虚拟的地址。
s=mmap(0,size+sizeof(struct stu),prot_read|prot_write,map_shared,fd,0);
/5.把数据写入虚拟地址。
printf("输入姓名:")
scanf("%s",s[count].name);
printf("输入年龄:")
scanf("%d",&s[count].age));
printf("输入成绩:")
scanf("%f",&s[count].score));
ftruncate(fd,size+sizeof(struct stu));
for(i=0;i终端破坏ui,禁止在curses中使用标准io.
1.编程模型初始化终端initscr
操作终端(输入/输出/定位/刷新。
释放终端endwin
2.显示。2.1.图形输出。
border
box hline
vline#include <>
int main()
initscr();初始化终端。
/border(0,0,0,0,0,0,0,0);/默认字符。
box(stdscr,0,0);
mvhline(2,10,'=20);
mvvline(2,10,'|10);
refresh();
/wrefrsh(stdscr);
getch();等待一个字符输入endwin();释放终端。
return 0;
属性字符:字节=属性字节+字符字节注意:
box需要窗体。
initscr返回被初始化的窗体:标准屏幕window*
实际上curses定义一个全局变量stdscr就是标准屏幕函数命名规则标准屏幕stdscr
w***指定窗体。
mv***指定位置。
mvw***指定窗体的指定位置。
2.2.刷屏。
void refresh()
void wrefresh(window*);
从里到外刷屏。
2.3.字符输出。
addch普通字符:''
属性字符: '属性 //位与,属性可以man attron查看可选属性特殊的属性字符(特殊形状):比如acs_pi
2.4.字符串输出。
int addstr(const char *)
2.5.格式字符串输出。
int printw(const charinclude <>
main()
char name[9]=;
int r;
initscr();
/绘制uimvaddstr(4,10,"用户输入。
r=mvgetnstr(4,16,name,8);
/name[r]=0;
/打印输入。
mvprintw(7,10,"你输入的是:%s",name);
refresh();
/输入字符
getch();
endwin();
3.字符属性与颜色颜色属性。
3.1.判定终端是否支持颜色。
bool has_colors();都支持颜色,建议不判定。
3.2.初始化颜色:
int start_color();
3.3.定义颜色对。
int init_pair(short pair,short fore,short back);
3.4.使用颜色对。
color_pair(short pair)
3.5.设置属性。
attron()开启属性。
attroff()关闭属性括号里传入所需要开启或者关闭的属性如:attron(color_pare(1));开启颜色对1
这组函数一定要在initscr后调用背景函数:
bkgd();
#include <>
#include <>
#include <>
void init();
void drawui();
void business();
void destroy();
main()
init();
drawui();
business();
destroy();
void business()
time_t tt;
struct tm *t;
while(1)
/取时间。tt=time(0);
t=localtime(&tt);
/显示时间。
mvprintw(lines/2,(cols-8)/2,%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);
/刷新屏幕。
refresh();
sleep(1void drawui()
box(stdscr,0,0);
void destroy()
endwin();
void init()
initscr();
2.登录界面。
1.初始化。
2.绘制界面头绘制用户名输入区绘制密码输入区。
3.等待输入。
4.结束。#include <>
#include <>
#include <>
#include <>
void init();
void drawlogin();
void destroy();
main()
init();
drawlogin();
destroy();
void drawlogin()
char *heads="联通bss业务支撑系统";
char *user="用户char *pass="口令box(stdscr,0,0);
attron(a_bold);
mvaddstr(3,(cols-strlen(heads))/2,heads);
mvhline(4,(cols-strlen(heads))/2,0,strlen(heads));
attroff(a_bold);
mvaddstr(8,(cols-strlen(user))/2,user);
mvaddstr(10,(cols-strlen(pass))/2,pass);
refresh();
void destroygetch();
endwinvoid init()
initscr();
4.输入。1.字符输入。
int getch();
返回的是字符禁止回显noecho() 回显只是输入以后不会出现在屏幕上,输入密码时采用这种方式使功能键有效,使用keypad(window*,bool)
#include <>
main()
int ch;
/初始化。initscr();
noecho();
/循环输入。
while(1)
ch=mvgetch(5,10);
/循环显示输入。
mvprintw(8,10,"你输入的是:%c(%d)",ch,ch释放。
endwin();
案例:使用键盘控制字母在屏幕上的移动补充:
curses屏幕清除:man 3 clear
clearerase
光标控制:得到光标位置 getsyx
设置光标的位置 setsyx
控制光标是否可见:curs_set();
2.字符串输入。
int addstr
3.格式数据输入。
scanw#include <>
main()
int ch;
int x=5,y=5;
initscr();
keypad(stdscr,true);
curs_set(0);
noecho();
mvaddch(y,x,'a');
while(1)
ch=getch();
/mvaddch(y,xclrtoeol();
erase();
/clear();
switch(ch)
case key_up:
y--;break;
case key_down:
y++;break;
case key_left:
x--;break;
case key_right:
x++;break;
mvaddch(y,x,'a');
refreshendwin();
5.窗口 subwin()/创建子窗体(坐标采用标准屏幕坐标)
derwin()/创建子窗体(坐标采用父窗体坐标)
#include <>
main()
window *w;
initscr();
box(stdscr,0,0);
w=derwin(stdscr,4,20,5,3);
box(w,0,0);
refresh();
wrefresh(w);
getch();
endwininclude <>
void init();
void drawui();
void dealinput();
void destroy();
main()
init();
drawui();
dealinput();
destroy
void dealinput()
int a,b;
while(1)
mvaddstr(2,3mvscanw(2,3,"%d",&a);
mvaddstr(2,11mvscanw(2,11,"%d",&b);
mvaddstr(2,19mvprintw(2,19,"%d",a+b);
refreshvoid drawui()
mvaddstr(2,2refresh();
void destroy()
endwin();
void init()
initscr();
1.在vi设置编码:
set encoding=编码 gb2312 ios-8859-1 utf-8
2.在编译器指定源文件的编码 -finput-charset=gb2312
3.在终端指定编码:
4.系统默认编码。
etc/sysconfig/i18n配置编码作业:(使用文件映射)
1.使用内存方式读取数据。
2.使用curses+io完成:图书信息的录入。
3.使用curses+io显示图书信息:
每次显示一条:
使用up down键翻滚记录数据。
4.读取文件文件,使用curses 显示。
实现如下功能:
上下翻页功能输入q,结束功能
Linux编程笔记
资源。include 线程 lpthread include include include include include include include include include include include include 2010年9月16日。复习。2010年9月17日上午。静态库文...
高级查询day
子查询。可以出现在where中,from中,h ing中,select中。当前查询需要建立在另一个查询的结果基础之上,这里就要利用到子查询。子查询在where子句中。1.单行单列子查询通常用在where子句中。2.多行单列子查询通常用在where 子句,in中。3.多行多列子查询通常用在from 中...
《LINUX系统及其编程》复习
1 linux系统的结构。2 linux分区的创建 分区类型 分区参数 3 交换分区 swap 的作用。习题 15 4 linux终端的数量及工作方式 linux虚拟控制台的选择方法。5 什么是shell?shell的作用是什么?6 shell提示符 用户登录名 主机名当前目录 或者 7 输入输出重...