福建农林大学计科linux复习
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LINUX程序设计复习(内部参考)
[一]ouch.c p 406 信号处理
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
void ouch()
{ printf("OUCH!\n");
(void)signal(SIGINT,SIG_DFL);
}
main()
{ (void)signal(SIGINT,ouch);
while(1)
{ printf("Hello world!\n");
sleep(1);
}
}
[二]gmtime.c 书本p 125
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
main()
{ struct tm *tp;
time_t t;
(void) time(&t);
tp=gmtime(&t);
printf("date:%d/%d/%d\n",tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday); printf("time:%d:%d:%d\n",tp->tm_hour+8,tp->tm_min,tp->tm_sec);
}
[三]fork.c 书本p 398
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main()
{ pid_t pid;
char *s;
int n,exit_code;
printf("fork program starting\n");
pid=fork();
if (pid==0) printf("parent\n"); else printf("child\n");
}
/*
fork函数用于创建一个新进程
返回值:
负数:如果出错,则fork()返回-1,此时没有创建新的进程。
最初的进程仍然运行。
零:在子进程中,fork()返回0
正数:在父进程中,fork()返回正的子进程的PID*/
[四]cpfile.c 书本p 87 文件复制
#include <unistd.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#define MAX 1000
main()
{ int fin,fout,count;
char buf[MAX]={0};
fin=open("a.dat", O_RDONLY);
fout=open("b.dat", O_WRONL Y | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
do
{ count=read(fin,buf,sizeof(buf));
if (count>0) write(fout,buf,count);
} while (count>0);
close(fin);
close(fout);
}
/*
1)open()
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
参数pathname 指向欲打开的文件路径字符串
Flags:
O_RDONLY 以只读方式打开文件O_WRONL Y 以只写方式打开文件O_RDWR 以可读写方式打开文件。
O_CREAT 若欲打开的文件不存在则自动建立该文件。
O_EXCL 如果O_CREAT 也被设置,此指令会去检查文件是否存在。
O_TRUNC 把文件长度设置为0,丢弃已有的内容。
O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
Mode:
S_IRUSR ,00400权限,代表该文件所有者具有可读取的权限。
S_IWUSR ,00200 权限,代表该文件所有者具有可写入的权限。
S_IXUSR ,00100 权限,代表该文件所有者具有可执行的权限。
S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
S_IROTH 00004 权限,代表其他用户具有可读的权限S_IWOTH 00002权限,代表其他用户具有可写入的权限。
S_IXOTH 00001 权限,代表其他用户具有可执行的权限。
2)write()和read()
size_t write (int fildes , const void *buf , size_t nbytes);
系统调用write的作用是:把缓冲区buf的前nbytes个字节写入与文件描述符fildes 关联的文件中。
它返回实际写入的字节数。
如果函数返回0,表示未写入任何数据;如果返回-1,表示write调用出错。
size_t read (int fildes , void *buf , size_t nbytes);
系统调用read的作用是:从文件描述符fildes关联的文件里读入nbutes个字节数据,并把他们放到数据区buf中。
返回实际读入的字节数。
如果函数返回0,表示未写入任何数据,已经到达了文件尾;如果返回-1,表示read调用出错。
*/
[五]sum 书本p32 for语句、p33 while 语句
#该程序是直接在linux下运行的脚本程序,对输入的参数N,求1+2+...+N的值。
#方法1
s=0
for i in $(seq $1)
do
s=$(($s+$i))
done
echo $s
#方法2
s=0
i=1
while [ $i -le $1 ]; do
s=$(($s+$i))
i=$(($i+1))
done
echo $s
[六]gcd 书本p 29 if语句
#该程序是直接在linux下运行的脚本程序,对输入的两个参数求最大公约数if [ $1 -gt $2 ];then
m=$1
n=$2
else
m=$2
n=$1
fi
while [ $n -ne 0 ]; do
t=$n
n=$(($m % $n))
m=$t
done
echo $m
[七] bdm 书本p237 数据库
[1]create_dbm1.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <gdbm/ndbm.h>
main()
{ FILE *fr;
char s[1024], sno[10];
int m;
datum key,dat;
DBM *dbp;
dbp=dbm_open( "/tmp/score1",O_RDWR | O_CREAT, 0666);
fr=fopen("score.txt","r");
while (!feof(fr))
{ fgets(s,1020,fr);
sscanf(s,"%s%*s%d",sno,&m);
printf("%s: %d\n", sno,m);
key.dptr=(void *)sno;
key.dsize=strlen(sno);
dat.dptr=(void *)&m;
dat.dsize=sizeof(int);
dbm_store(dbp,key,dat,DBM_REPLACE);
}
fclose(fr);
dbm_close(dbp);
}
[2]create_dbm2.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <gdbm/ndbm.h>
struct sty
{ char name[20];
int m;
};
main()
{ FILE *fr;
char s[1024], sno[10];
struct sty x;
datum key,dat;
DBM *dbp;
dbp=dbm_open( "/tmp/score2",O_RDWR | O_CREAT, 0666);
fr=fopen("score.txt","r");
while (!feof(fr))
{ fgets(s,1020,fr);
sscanf(s,"%s%s%d",sno,,&x.m);
printf("%s %20s: %d\n", sno,,x.m);
key.dptr=(void *)sno;
key.dsize=strlen(sno);
dat.dptr=(void *)&x;
dat.dsize=sizeof(x);
dbm_store(dbp,key,dat,DBM_REPLACE);
}
fclose(fr);
dbm_close(dbp);
}
[3]use_dbm1.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <gdbm/ndbm.h>
main()
{ char s[1024], sno[10];
int m;
datum key,dat;
DBM *dbp;
dbp=dbm_open( "/tmp/score1",O_RDWR , 0666);
for(key=dbm_firstkey(dbp); key.dptr; key=dbm_nextkey(dbp)) { memcpy(sno,key.dptr,key.dsize);
sno[key.dsize]='\0';
dat=dbm_fetch(dbp,key);
memcpy(&m,dat.dptr,dat.dsize);
printf("%s: %d\n",sno,m);
}
key.dptr="S1013008";
key.dsize=8;
dat=dbm_fetch(dbp,key);
if (dat.dptr)
{ memcpy(&m,dat.dptr,dat.dsize);
printf("%d\n",m);
m=200;
dat.dptr=(void *)&m;
dat.dsize=sizeof(int);
dbm_store(dbp,key,dat,DBM_REPLACE);
} else printf("No data found for key\n");
dbm_close(dbp);
}
[4]use_dbm2.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <gdbm/ndbm.h>
struct sty
{ char name[20];
int m;
};
main()
{ char s[1024], sno[10];
struct sty x;
datum key,dat;
DBM *dbp;
dbp=dbm_open( "/tmp/score2",O_RDWR , 0666);
for(key=dbm_firstkey(dbp); key.dptr; key=dbm_nextkey(dbp)) { memcpy(sno,key.dptr,key.dsize);
sno[key.dsize]='\0';
dat=dbm_fetch(dbp,key);
memcpy(&x,dat.dptr,dat.dsize);
printf("%s: %20s %d\n",sno,,x.m);
}
key.dptr="S1013008";
key.dsize=8;
dat=dbm_fetch(dbp,key);
if (dat.dptr)
{ memcpy(&x,dat.dptr,dat.dsize);
printf("%d\n",x.m);
x.m=200;
dat.dptr=(void *)&x;
dbm_store(dbp,key,dat,DBM_REPLACE);
} else printf("No data found for key\n");
dbm_close(dbp);
}
[八]key.c 书本p 183 键盘输入
#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
#define ESC 27
main()
{ int key;
initscr();
crmode();
keypad(stdscr,TRUE);
noecho();
clear();
mvprintw(5,5,"Key pad demonstration. Press 'q' to quit");
refresh();
key=getch();
while (key!=ERR && key!='q')
{ move(7,5);
clrtoeol();
switch(key)
{ case ESC: printw("%s","Escape key!"); break;
case KEY_END: printw("%s","End key!"); break;
case KEY_BEG: printw("%s","BEG key!"); break;
case KEY_RIGHT:printw("%s", "RIGHT key"); break;
case KEY_LEFT: printw("%s", "LEFT key"); break;
case KEY_UP: printw("%s", "UP key"); break;
case KEY_DOWN: printw("%s","DOWN key"); break;
case 8: printw("%s","back"); break;
case 9: printw("%s","Tab key"); break;
case 10:
case 13: printw("%s","Enter key"); break;
case 32: printw("%s","VK_SPACE"); break;
case 262: printw("%s","Home"); break;
case 263: printw("%s","Backspace"); break;
case 331: printw("%s","insert");break;
case 339: printw("%s","Page Up"); break;
case 338: printw("%s","Page down"); break;
case 330: printw("%s","Delete"); break;
default: printw("Key was: %c",key);
}
refresh();
key=getch();
}
endwin();
exit(EXIT_SUCCESS);
}
[九]menu.c 书本p193
#include <curses.h>
#include <stdlib.h>
#include <unistd.h>
main()
{ char *option[]={"Add","Delete","Modify","Quit",NULL};
//WINDOW *pad;
int key,srow, scol, crow=0;
int i;
char *p;
initscr();
keypad(stdscr,TRUE);
cbreak();
noecho();
srow=5; scol=5;
i=0;
while (option[i])
{ if (i==crow) attron(A_STANDOUT);
mvprintw(srow+i,scol,"%s",option[i]);
if (i==crow) attroff(A_STANDOUT);
i++;
}
refresh();
key=0;
i=crow;
while (key!=27)
{ key=getch();
switch (key)
{ case KEY_DOWN: i++; if (i==4) i=0; break;
case KEY_UP: i--; if (i<0) i=3; break;
}
if (i!=crow)
{ mvprintw(srow+crow,scol,"%s",option[crow]);
attron(A_STANDOUT);
mvprintw(srow+i,scol,"%s",option[i]);
attroff(A_STANDOUT);
refresh();
crow=i;
}
}
keypad(stdscr,FALSE);
nocbreak();
echo();
endwin();
exit(EXIT_SUCCESS);
}
/*
attron(mod): 开启属性.
attroff(mod): 关闭属性.
curses.h 里头定义了一些属性, 如:
A_STANDOUT: 反色
A_DIM:
A_UNDERLINE: 加底线.
A_REVERSE: 反白.
A_BLINK: 闪烁.
A_BOLD: 高亮度.
*/
[十]mwin.c 书本p178 屏幕
#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
#include <stdio.h>
main()
{ WINDOW *nwp,*pwp;
int x,y;
char c='a';
initscr(); //初始化
move(5,5); //将光标移动到屏幕上坐标(5,5)处
printw("%s","Test multiple windows");
sleep(2); //将程序暂停2秒钟
for(y=0;y<LINES-1;y++)
{ for(x=0;x<COLS-1;x++)
{ mvwaddch(stdscr,y,x,c); //在stdscr窗口中移动光标到(y,x) ,增加字符c
c++;
if (c>'z') c='a';
}
}
refresh(); //刷新屏幕
sleep(2);
nwp=newwin(10,10,5,5); //在(5,5)创建一个10行10列(10*10)的新窗口box(nwp,'|','-');
mvwprintw(nwp,2,2,"%s","Hello!");
wrefresh(nwp); //刷新nwp窗口
sleep(2);
pwp=newwin(10,20,8,8);
box(pwp,'|','-');
mvwprintw(pwp,5,2,"%s","Hello World!");
wrefresh(pwp);
sleep(2);
touchwin(nwp); //向curses函数库通知nwp窗口内容发生改变
wrefresh(nwp); //此时curses必须重新绘制nwp窗口。
//当屏幕上又多个窗口时通过这两句安排要显示的窗口sleep(2);
wclear(nwp); //对nwp窗口清屏
wrefresh(nwp);
sleep(2);
delwin(nwp); //删除子窗口nwp
touchwin(pwp);
wrefresh(pwp);
sleep(2);
delwin(pwp);
touchwin(stdscr);
refresh();
endwin();
exit(EXIT_SUCCESS); //告诉系统程序正常退出
}
/*
initscr()函数将终端屏幕初始化为curses模式。
它清除屏幕上所有的字符,使屏幕变为空白,等待下一部处理。
所有curses程序必须以initscr函数开始,以endwin 函数结束。
touchwin函数是比较特殊的。
他会通知curses库其参数所指向的窗口内容已经发生了改变。
这就意味着curses库会在下一次调用wrefresh时重新绘制窗口,尽管我们并没有实际的改变窗口内容。
当我们有多个窗口在屏幕上层叠显示而我们需要决定显示哪个窗口时,这个函数会非常有用。
*/。