more指令

more指令是unix操作系统中的自带指令,其功能是将文件中的内容输出到终端上。相似功能的指令还有cat、less。
cat:将文件中所有内容全部输出到终端上。
more:将文件中的内容逐页显示到终端上,用户按空格键显示下一页,按b键退出,按回车键显示下一行。
less:比more拥有更多的功能,可以实现向前翻页。

实现more指令

在实现more指令之前,需要搞清楚,more指令的工作流程:将指定文件内容显示一页(24行)后,等待用户指令,如果指令‘q’则推出,是‘\n’则显示下一行,是‘ ’则显示下一页。直到文件内容全部输出完。

代码
#include"apue.h"
#include<stdio.h>
#define LINELEN 512
#define pagelen 23
int see_more(FILE* cmd)//获取指令
{char c;printf("\033[7m more?\033[m");while((c=getc(cmd))!=EOF){if(c=='q')return 0;if(c==' ')return pagelen;if(c=='\n')return 1;}return 0;
}void do_more(FILE *fp)//执行
{char line[LINELEN];int num=0;int relay;FILE* fp_tty;if((fp_tty=fopen("/dev/tty","r"))==NULL)//读/dev/tty相当于从键盘获得输入,写/dev/tty相当于向屏幕输出。exit(1);while(fgets(line,LINELEN,fp))//使用fgets逐行读入{if(num==pagelen){relay=see_more(fp_tty); //等待用户响应if(relay==0)exit(0);num-=relay;}if(fputs(line,stdout)==EOF)exit(1);num++;}
}
int main(int argc,char* argv[])
{FILE *fp;if(argc==1)do_more(stdin);else{while(--argc){if((fp=fopen(*++argv,"rb"))!=NULL) //将指定文件逐个输出   {do_more(fp);fclose(fp);}elseexit(1);}}return 0;
}

程序中还存在很多问题,其中在键入指令时需要回车才能让程序得到指令,但是在系统自带的more指令中是不需要的。而且也未添加显示百分比的功能。

这是写过的第一篇博客,希望每天能进步一点,加油,坚持!

-----------------------------------------------------分割线------------------------------------------------------在《unix/linux编程实践》书中第六章讲到了对终端进行编程。
在unix操作系统中,终端也只是一个特殊的文件。在上一次编写的more程序中,存在一个问题就是,每当用户输入指令时,需要按回车键,程序才能获得我们所输入的指令,而且回车键也会被作为一个指令处理。这与unix中的more指令肯定是不一样的。现在我们就通过修改终端文件来实现这个功能。需要用到两个函数:
int tcgetaddr(int fd,struct termios* info);
int tcsetaddr(int fd,int when,struct termios* info);
第一个函数获取fd文件描述符所关联的终端驱动程序的属性,并将其存放在info指向的地址中。
第二个函数将fd关联的终端驱动程序的属性设置为info所指属性。标志位when可以是:TCSANOW:立即修改
TCSADRAIN:等待驱动程序中的所有输出被传到终端后再修改。
TCSAFLUSH:待所有输出被传出去,释放所有输入,再修改。

代码
#include"apue.h"
#include<stdio.h>
#include<termios.h>
#define LINELEN 512
#define pagelen 23
static struct termios mode;void tty_mode(int how)//获取当前终端属性,用于程序结束后将终端驱动属性恢复
{if(how==0){tcgetattr(0,&mode);}else{tcsetattr(0,TCSANOW,&mode);}
}
void set_mode()
{struct termios ttystate;tcgetattr(0,&ttystate);ttystate.c_lflag&=~ICANON;//关闭缓冲,不在需要回车才能让程序获得指令ttystate.c_lflag&=~ECHO;//关闭回显ttystate.c_cc[VMIN]=1;//终端每次获取字符数为1tcsetattr(0,TCSANOW,&ttystate);
}
int see_more(FILE* cmd)
{char c;printf("\033[7m more?\033[m");set_mode();while((c=getc(cmd))!=EOF){if(c=='q'){tty_mode(1);return 0;}else if(c==' '){ tty_mode(1);return pagelen;}else if(c=='\n'){ tty_mode(1);return 1;}elsecontinue; }return 0;
}void do_more(FILE *fp)
{char line[LINELEN];int num=0;int relay;FILE* fp_tty;if((fp_tty=fopen("/dev/tty","r"))==NULL)exit(1);while(fgets(line,LINELEN,fp)){if(num==pagelen){relay=see_more(fp_tty); //wait userif(relay==0)exit(0);num-=relay;}if(fputs(line,stdout)==EOF)exit(1);num++;}
}
int main(int argc,char* argv[])
{FILE *fp;tty_mode(0);if(argc==1)do_more(stdin);else{while(--argc){if((fp=fopen(*++argv,"rb"))!=NULL)    {tty_mode(0);set_mode();do_more(fp);fclose(fp);tty_mode(1);}elseexit(1);}}return 0;
}

UNIX编程学习——more指令实现相关推荐

  1. UNIX再学习 -- shell编程

    UNIX环境高级编程看了三章,遇到不少重定向等shell命令.本想到Linux时再讲,看来有必要提前了.之前有看过一本<嵌入式Linux软硬件开发详解>这本书里有简单介绍了一部分shell ...

  2. 学习linux/unix编程方法的建议-转

    假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过  我想大概可以分为4个阶段,水平从低到高  从安装使用=>linux常用命令=>li ...

  3. Unix编程需要学习的内容(3)《精通Unix下C语言与项目实践》读书笔记(13)

    <精通Unix下C语言编程与项目实践>读书笔记(new) 文章试读  不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八 ...

  4. 12.ROS编程学习:ROS常用指令

    目录 rosnode 1.rosnode list--list active nodes 2.rosnode ping--test connectivity to node 3.rosnode inf ...

  5. 学习Unix编程应该看的书籍整理

    最近看到网上的一段关于Unix底层工作方面的评论,深以为然: ============================================================ 底层个人觉得有两 ...

  6. UNIX再学习 -- 用户 ID 和组 ID

    用户 ID和组 ID 的内容已经在好几章中出现过了.之前都没有讲到,现在放到一起总结. 一.用户 ID 和 组 ID 回顾 1.我们在APUE 第 4.6.8 章,都有涉及到. 其中我们用到的地方: ...

  7. UNIX再学习 -- exec 函数族

    我们在讲,文件I/O的时候,简单提到过 exec 函数,讲到 vfork 的时候,也有用到.下面我们来详细介绍下它. 参看:UNIX再学习 -- 文件I/O  参看:UNIX再学习 -- 函数 for ...

  8. UNIX再学习 -- 文件描述符

    在 UNIX/Linux 系统中,一切皆文件,这句话想必都有听过.对于文件的操作几乎适用于所有的设备,这也就看出了文件操作的重要性了.在C语言再学习部分有讲过标准I/O文件操作,参看:C语言再学习 - ...

  9. python网络编程学习笔记(二)

    python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...

最新文章

  1. 【10.4】线程同步--Lock、RLock
  2. C#排队处理DEMO
  3. 什么才是尊重自己呢?
  4. JAVA思维导图学习笔记_8张思维导图,55天学习笔记,帮你入门JavaSE
  5. 在Spring MVC流中使用rx-java Observable
  6. hihoCoder挑战赛14 -1223
  7. 致力于绿色环保的美国大型数据中心
  8. 机器学习--k均值聚类(K-means)
  9. mp4文件如何转换为webm格式
  10. Windows删除服务
  11. 小米OJ Carryon 数数字(Python)
  12. Acwing算法提高课—搜索
  13. QTDialog去掉右上角问号保留X
  14. C#面向对象程序设计课程实验二: 实验名称:Windows 窗体程序
  15. php的AES-128 EBC加密、解密
  16. Win10的两个实用技巧系列之使用技巧、GPUinfo
  17. Python安装pylab模块
  18. Open3d从RGBD生成点云、mesh
  19. 计算机工具的认识教学反思,-计算机常用工具软件教学反思(最新整理)
  20. YOLOv3物体/目标检测之实战篇(Windows系统、Python3、TensorFlow2版本)

热门文章

  1. Android 经典 Crash 分析,Android Crash 原理分析
  2. Win10应用右下角小盾牌怎么解决?
  3. 深圳软件测试培训学习:【性能术语】八大类性能测试
  4. Java leetcode 相交链表
  5. 手持多线激光三维重建
  6. Windows XP 故障恢复控制台的说明
  7. “闪婚”的代价:亿晶光电控股权陷“罗生门”
  8. Flex布局——flex-basis、flex-grow、flex-shrink
  9. Tech Ed 2007 历“鲜”记
  10. 服务器上安装oracle隔夜老挂,[转自Oracle官方博客]一次服务器时间调整引发的实例宕机...