linux高级编程day

发布 2021-04-27 23:14:28 阅读 6614

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 输入输出重...