more命令编写

打开文件的函数使用C自带的函数

FILE* fopen(char* path,char *r); 成功返回FIEL指针

读取文件记录的函数 fgets(buf,counts,fp); 成功返回实践读取的字数

设置客户端的终端控制,如输入空格换屏,不要回显,当字符处理等

使用 termios.h头函数

struct termios info; 

tcgetattr(0,&info) ;读取终端设置,失败返回-1

tcsetattr(0,TCSANOW,&info); 设置终端设置,失败返回-1,TCSANOW可以设置终端立即相应

屏蔽终端的中断信号SIGINT,使在按下ctrl - c 时退出并且能够恢复终端的设置

信号控制使用signal.h头函数

signal(SIGINT,fun*);SIGQUIT,SIGIO等

此程序参考 unix/linux 编程实签教程

 

 

#include<stdio.h>
#include
<termios.h>
#include
<signal.h>
#define PAGELINE 24
#define LINELEN 256
void    do_more(FILE *);
int     see_more(FILE *);
void set_tty_mode();
void reset_tty(int flag);
void ctrl_c_hander();
int main(int ac,char* av[])
{
FILE 
*fp;
reset_tty(
0);
set_tty_mode();
signal(SIGINT,ctrl_c_hander);
if(ac==1//equal is command self
        do_more(stdin);
else
        
while(--ac)
        {
                
if((fp=fopen(*++av,"r"))!=NULL)
                {
                        do_more(fp);
                        fclose(fp);
                }
                
else
                {
                        reset_tty(
1);
                        
return -1;

                }
        }
reset_tty(
1);
return 0;
}
void do_more(FILE *fp)
{
        
char line[LINELEN];
        
int readline=0,reply;
        FILE 
*ttyfp;
        
if((ttyfp=fopen("/dev/tty","r"))==NULL)
                exit(
1);

        
while(fgets(line,LINELEN,fp))  //return NULL is error
        {
                
if(readline==PAGELINE)
                {
                        reply
=see_more(ttyfp);
                        
if(reply==0)
                                
break;
                        
else
                                readline
-=reply;
                }
                
if(fputs(line,stdout)==EOF) //return EOF is error
                        exit(1);
                readline
++;
        }
}
int see_more(FILE *ttyfp)
{
        
char c;
        printf(
"\033[7m more? \033[m");
        
while((c=getc(ttyfp))!=EOF) //return EOF is error ,from tty
        {
                
if(c=='q')
                        
return 0;
                
if(c==' ')
                        
return PAGELINE;
                
if(c=='\n')
                        
return 1;
        }
        
return 0;
}
void set_tty_mode()
{
struct termios setting;
tcgetattr(
0,&setting);
setting.c_lflag 
&= ~ECHO;
setting.c_lflag 
&= ~ICANON;
setting.c_cc[VMIN]
=1;
tcsetattr(
0,TCSANOW,&setting);
}
void reset_tty(int flag) //if flag=1 reset tty. flag=0 save tty mode
{
static struct termios info;
static int    reset=0;
if(flag==0)
{
        tcgetattr(
0,&info);
        reset
=1;
}
else if(reset==1)
{
        tcsetattr(
0,TCSANOW,&info);

}
}
void ctrl_c_hander()
{
reset_tty(
1);
exit(
1);
}

 

posted on 2009-04-05 14:56  ringwang  阅读(338)  评论(0编辑  收藏  举报