libevent(9)通过libevent实时监听文件的更新

该代码示例展示了如何利用libevent库监听CentOS系统中/var/log/secure文件(Ubuntu下为/var/log/auth.log)的变化,读取并处理login日志。程序创建了一个非阻塞的文件描述符,设置事件监听器以跟踪文件读取事件,并持续处理新数据。
摘要由CSDN通过智能技术生成

这里我们利用libevent监听centos系统上的login日志文件,文件路径:/var/log/secure。(ubuntu下是"/var/log/auth.log")

代码如下 test_file.cpp:


#include <iostream>
#include <thread>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <event2/event.h>
#include <event2/listener.h>
#include <event2/thread.h>

#define SPORT 5001

using namespace std;

void read_file(evutil_socket_t fd, short which, void* arg){
    char buf[1024] = {0};
	int len = read(fd, buf, sizeof(buf) - 1);
	if(len > 0){
        cout<<buf<<endl;
	}else{
	    cout<<"."<<flush;
		this_thread::sleep_for(chrono::seconds(1));
	}
}

int main()
{
#ifdef _WIN32
    //windows初始化socket库
    WSADATA wsa;
    WSAStartup(MAKEWORD(2, 2), &wsa);
#else
    //发送数据给已关闭socket时,忽略管道信息.
    //否则可能导致程序dump.
    if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
        return -1;
    }
#endif
    event_config* conf = event_config_new();
	//设置文件描述符
	event_config_require_features(conf, EV_FEATURE_FDS);
    event_base* base = event_base_new_with_config(conf);
	event_config_free(conf);
	if(!base){
	    cerr<<"event_base_new_with_config failed!"<<endl;
		return -1;
	}

	//ubuntu下打开"/var/log/auth.log"
    int sock = open("/var/log/secure", O_RDONLY|O_NONBLOCK, 0);
	if(sock <= 0){
	    cerr<<"open /var/log/secure failed!"<<endl;
		return -2;
	}
	
	//文件指针移到结尾处
	lseek(sock, 0, SEEK_END);
	
	//监听文件数据
	event* fev = event_new(base, sock, EV_READ|EV_PERSIST, read_file, 0);
	event_add(fev, NULL);
    
	std::cout<<"............."<<std::endl;
    event_base_dispatch(base);
    event_base_free(base);

#ifdef _WIN32
    //清理window的socket库
    WSACleanup();
#endif

    return 0;
}

在centos下的执行结果如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值