lnkTail.h

/************************************************************ 文件名称:    lnkTail.h* 功能描述:    类似linux系统tailf命令的功能* 实现原理:    每次比较文件大小,发生变化则打开文件偏移到*               上一次记录的文件大小处再读取文件内容* 主要实现:    另起线程将每次读取的内容存入队列,供其它调*               用模块实时监控日志。* 历史信息:    lnk 创建 2015.10.25************************************************************/
#ifndef _LNK_TAIL_H_
#define _LNK_TAIL_H_#include <string>
#include <queue>using namespace std;typedef struct tag_Line{string sText;   //行内容string sTime;   //读取时的时间
}Line;class Tail{
public:void SetFileName(string sPramFileName); //设置要tailf的文件名称string GetFileName();                   //获取文件名称void TailFile();                        //tailf文件Line GetLine();                         //获取行bool Empty();                           //判断是否有新行加入队列
private:string sFileName;                       //文件名称queue<Line> qLines;                     //行队列
};#endif //_LNK_TAIL_H_

lnkTail.cpp

/************************************************************ 文件名称:    lnkTail.cpp* 功能描述:    类似linux系统tailf命令的功能的实现* 历史信息:    lnk 创建 2015.10.25************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/stat.h>
#include <time.h>
#include <pthread.h>
#include <string.h>#include "lnkTail.h"#define _(s) s  //tailf线程参数结构
typedef struct tag_TailPram{char *pcFileName;queue<Line> *pqLines;
}TailPram;//函数功能:获取文件大小
//参数说明:const char * [IN] 文件名称
//返 回 值:size_t 文件大小
//历史信息:lnk 创建 2015.10.25
static size_t filesize(const char *filename)
{  struct stat sb;  if (!stat(filename, &sb)) return sb.st_size;  return 0;
} //函数功能:设置文件名称
//参数说明:string [IN] 文件名称
//返 回 值:无
//历史信息:lnk 创建 2015.10.25
void Tail::SetFileName(string sPramFileName)
{this->sFileName = sPramFileName;
}//函数功能:获取文件名称
//参数说明:无
//返 回 值:string 文件名称
//历史信息:lnk 创建 2015.10.25
string Tail::GetFileName()
{return this->sFileName;
}//函数功能:获取文件名称
//参数说明:TailPram * 线程参数
//返 回 值:-1失败 0线程结束
//历史信息:lnk 创建 2015.10.25
void* TailFileToQueue(void *ptr)
{char cBuf[BUFSIZ];  size_t osize, nsize; FILE *pf;int nCnt = 0;TailPram *fileAndQue = (TailPram *)ptr;for (osize = filesize(fileAndQue->pcFileName);;){  nsize = filesize(fileAndQue->pcFileName);  if (nsize != osize) {  if (!(pf = fopen(fileAndQue->pcFileName, "r"))) {  fprintf(stderr, _("Cannot open \"%s\" for read\n"), fileAndQue->pcFileName);  return (void *)-1;}  if (!fseek(pf, osize, SEEK_SET)){while ((nCnt = fread(cBuf, 1, sizeof(cBuf), pf)) > 0)  {//fwrite(cBuf, 1, nCnt, stdout);  time_t lt;Line stNewLine;stNewLine.sText = cBuf;lt = time(NULL);stNewLine.sTime = ctime(<); fileAndQue->pqLines->push(stNewLine);//printf("%s %s",stNewLine.sText.c_str(), stNewLine.sTime.c_str());}}//fflush(stdout);  fclose(pf);  osize = nsize;  }  usleep(250000);  }return (void*)0;
}//函数功能:tail文件
//参数说明:无
//返 回 值:无
//历史信息:lnk 创建 2015.10.25
void Tail::TailFile()
{pthread_t pid;TailPram *fileAndQue = new TailPram;fileAndQue->pcFileName = (char *)malloc(strlen(this->sFileName.c_str()));strcpy(fileAndQue->pcFileName, this->sFileName.c_str());fileAndQue->pqLines = &this->qLines;int ret = pthread_create(&pid, NULL, TailFileToQueue, (void*)fileAndQue);if(ret){fprintf(stderr, _("Cannot create pthread!\n"));return;}//pthread_join(pid, NULL);//fprintf(stderr, _("tail stop"));
}//函数功能:是否监控到新行
//参数说明:无
//返 回 值:true false
//历史信息:lnk 创建 2015.10.25
bool Tail::Empty()
{return this->qLines.empty();
}//函数功能:获取行
//参数说明:无
//返 回 值:Line
//历史信息:lnk 创建 2015.10.25
Line Tail::GetLine()
{Line lRes;if(!this->qLines.empty()){lRes = this->qLines.front();this->qLines.pop();}return lRes;
}

mian.cpp  主要写写怎么使用!

#include <iostream>
#include <stdlib.h> #include "lnkTail.h"int main(int argc, char **argv)
{Tail myTail;if(argc != 2){cout<<"use like tail filename!"<<endl;return -1;}myTail.SetFileName(argv[1]);    //tailf文件名由参数传入myTail.TailFile();              //启动tailf线程while(1)                        //循环获取监控的新行{if(!myTail.Empty()){Line tmp = myTail.GetLine();cout<<tmp.sText<<tmp.sTime;}else{usleep(250000);}}return 0;
}

当然还需要在合适的地方把内存给释放了,懒得改了。有时间再看下。。

c++实现tailf命令相关推荐

  1. tailf 命令安装

    tailf 命令安装: -bash: tailf: command not found #Debian apt-get install util-linux #Ubuntu apt-get insta ...

  2. golang:实现类似tailf命令的功能

    支持自动结束tailf命令,本例适用于实时呈现临时文本文件内的日志信息 package mainimport ("bufio""fmt""io&quo ...

  3. Linux下好用的日志库,我使用過的Linux命令之tailf - 跟蹤日志文件/更好的tail -f版本...

    用途說明 tailf命令幾乎等同於tail -f,嚴格說來應該與tail --follow=name更相似些.當文件改名之后它也能繼續跟蹤,特別適合於日志文件的跟蹤(follow the growth ...

  4. Linux基础命令----tailf 跟踪文件输出

    描述 tailf命令几乎等同于tail -f,严格说来应该与tail --follow=name更相似些.当文件改名之后它也能继续跟踪,特别适合于日志文件的跟踪(follow the growth o ...

  5. 20210812 Linux相关命令:软连接与硬连接、tailf、mount

    软连接 软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接. 具体用法是:ln -s 源文件 目标文件. 当 我们需要在不同的目录,用到相同的文件时,我们不需要在 ...

  6. Linux基础命令使用

    date: 日期和时间 date[options] [+FORMAT] %s:时间戳计时法,从Unix元年(1970-01-01 00:00:00)到此刻所经过的秒数 %F,%D %T %Y %m % ...

  7. linux之通过tail命令动态跟踪日志文件里面的末尾信息

    1 问题场景 比如在linux系统,我们服务端的错误日志在一个文件里面不断输入进去,我们需要动态查看,我们总不可能每次进行cat文件查看 2 tail命令和head命令 head命令默认是输出一个文件 ...

  8. 查看操作系统版本linux_LINUX操作系统常用操作收录(二):查看文件内容命令小结...

    先整体了解一下如何查看文件内容的命令 vi 兼有修改功能的查看方式,会单独打开整个文件 vim 可修改文件内容并且显示当前查看位置在文件中的%多少 cat 由第一行开始显示内容,并将所有内容输出 ta ...

  9. 第三章 文件过滤及内容编辑处理命令

    3.1 cat cat命令作用: 1.查看文件内容 2.把多个文件合并成一个文件 3.编辑文件内容 4.结合>>和<<EOF进行编辑 5.清空文件内容 -n参数 从1开始对所有 ...

  10. 一天一条Linux指令-tailf

    用途说明 tailf命令几乎等同于tail -f,严格说来应该与tail --follow=name更相似些.当文件改名之后它也能继续跟踪,特别适合于日志文件的跟踪(follow the growth ...

最新文章

  1. 1-5-20:球弹跳高度的计算
  2. Live Writer测试
  3. 没有思路?一个数据案例,拯救你的产品优化切入点
  4. WWW 2021 | 融合先验知识的BERT注意力模型
  5. Python第七章-面向对象高级
  6. 服务器传文件的工具,向服务器传文件的工具
  7. proguard 反编译_Android Studio项目结构,编译器,ProGuard
  8. File Finder pro Mac版重复文件查找器使用方法
  9. Syntax error: Bad for loop variable
  10. Javascript高级程序设计(一)
  11. python nlpir_中文分词工具--NLPIR/ICTCLAS的Python版本使用
  12. RabbitMQ(二)
  13. 打卡day07 python基础—函数
  14. 手把手教学php表情包,手把手教你做微信表情包
  15. 微商城系统之商家平台任务自动分析处理系统_OctShop
  16. 8305天距离梦想还有8,352 千米 2012-03-31 23:18:53 柏林勃兰登堡门 再过两天就是我22周岁生日了,我在生命网站上摁下自己的出生年月,上面显示我已经度过了8305天,走
  17. uniapp unipush接入个推消息推送(各种踩坑记录)安卓+IOS+在线消息+离线消息
  18. Docker-使用Docker安装应用软件
  19. 单片机阻塞延时与非阻塞延时(1)
  20. 个人整理的AD/2000技巧

热门文章

  1. 计算机键盘基础知识课件,高中信息技术计算机基础应用课件:键盘操作练习
  2. 如何进入mysql命令界面
  3. 软件架构师的12项修炼——关系技能修炼(2)
  4. Astah Professional UML 建模工具2022版
  5. riscv-gnu-toolchain下载安装
  6. android4.4 计算器,卡西欧仿真计算器
  7. 计算机审计实验一计划阶段,审计实验1.ppt
  8. HTML5 Audio时代的MIDI音乐文件播放 .
  9. k易语言html导入超级列表框,易语言超级列表框导入TXT内容的方法
  10. Nike Zoom LeBron 15 Performance Review