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 );
}

 

你可能感兴趣的:(more)