libevent 学习:官方案例 event-read-fifo

路径:libevent-2.1.8-stable/sample

文件 event-read-fifo.c 

这个案例实现的是从命名管道读取内容。(考虑在Linux环境,删除跨平台相关代码)

#include <event2/event-config.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/queue.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <event2/event.h>

static void
fifo_read(evutil_socket_t fd, short event, void *arg)
{
	char buf[255];
	int len;
	struct event *ev = arg;

	fprintf(stderr, "fifo_read called with fd: %d, event: %d, arg: %p\n",
	    (int)fd, event, arg);
	len = read(fd, buf, sizeof(buf) - 1);

	if (len <= 0) {
		if (len == -1)
			perror("read");
		else if (len == 0)
			fprintf(stderr, "Connection closed\n");
		event_del(ev);
		event_base_loopbreak(event_get_base(ev));
		return;
	}

	buf[len] = '\0';
	fprintf(stdout, "Read: %s\n", buf);
}

/* On Unix, cleanup event.fifo if SIGINT is received. */
static void
signal_cb(evutil_socket_t fd, short event, void *arg)
{
	struct event_base *base = arg;
	event_base_loopbreak(base);
}

int
main(int argc, char **argv)
{
	struct event *evfifo;
	struct event_base* base;
	struct event *signal_int;
	struct stat st;
	const char *fifo = "event.fifo";
	int socket;

	if (lstat(fifo, &st) == 0) {
		if ((st.st_mode & S_IFMT) == S_IFREG) {
			errno = EEXIST;
			perror("lstat");
			exit(1);
		}
	}

	unlink(fifo);
	if (mkfifo(fifo, 0600) == -1) {
		perror("mkfifo");
		exit(1);
	}

	socket = open(fifo, O_RDONLY | O_NONBLOCK, 0);

	if (socket == -1) {
		perror("open");
		exit(1);
	}

	fprintf(stderr, "Write data to %s\n", fifo);
	fprintf(stderr, "Write data to %s %d\n", fifo, socket);
	/* Initalize the event library */
	base = event_base_new();

	/* Initalize one event */
	/* catch SIGINT so that event.fifo can be cleaned up */
	signal_int = evsignal_new(base, SIGINT, signal_cb, base);
	event_add(signal_int, NULL);

	evfifo = event_new(base, socket, EV_READ|EV_PERSIST, fifo_read,
                           event_self_cbarg());

	/* Add it to the active events, without a timeout */
	event_add(evfifo, NULL);

	event_base_dispatch(base);
	event_base_free(base);
	close(socket);
	unlink(fifo);
	libevent_global_shutdown();
	return (0);
}

编译:

gcc event-read-fifo.c -levent -o eventreadfifo 

运行。

然后写一个客户端往同一个命名管道写数据:

#include <stdio.h>                                                             
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <limits.h>
#include <stdlib.h>
#include <time.h>

#define BUFS PIPE_BUF

int main()
{
    int fd;
    int n, i;
    char buf[BUFS];
    time_t tp;

    printf("I am %d\n", getpid());
    if (access("event.fifo", F_OK) != 0)
    {
        if (mkfifo("event.fifo", 0666))
        {
            printf("event.fifo not existed, and create event.fifo failed!\n");
            exit(1);
        }
    }
    if ((fd = open("event.fifo", O_WRONLY)) < 0)
    {
        printf("Open failed!\n");
        exit(1);
    }

    for (i = 0; i < 10; i++)
    {
        time(&tp);
        n = sprintf(buf, "write_fifo %d sends %s", getpid(), ctime(&tp));
        printf("Send msg:%s", buf);
        if ((write(fd, buf, n + 1)) < 0)
        {
            printf("Write failed!\n");
            close(fd);
            exit(1);
        }
        sleep(1);
    }
    close(fd);
    exit(0);
}

编译:

gcc fifowrite.c -levent -o fifowrite

客户端输出,最后用ctrl + c 退出:

I am 5339
Send msg:write_fifo 5339 sends Thu Jan 10 09:38:41 2019
Send msg:write_fifo 5339 sends Thu Jan 10 09:38:42 2019
……
Send msg:write_fifo 5339 sends Thu Jan 10 09:38:47 2019
Send msg:write_fifo 5339 sends Thu Jan 10 09:38:48 2019
^C

服务端输出:

Write data to event.fifo
Write data to event.fifo 3
fifo_read called with fd: 3, event: 2, arg: 0x13b4870
Read: write_fifo 5339 sends Thu Jan 10 09:38:41 2019
……
fifo_read called with fd: 3, event: 2, arg: 0x13b4870
Read: write_fifo 5339 sends Thu Jan 10 09:38:48 2019

fifo_read called with fd: 3, event: 2, arg: 0x13b4870
Connection closed

 

结构体:

  • event_base:保存事件(分发)循环的信息和状态
  • event:单个事件

函数:

  • event_del:从监听事件集中移除,若没有监听的事件,事件循环会退出
  • event_base_loopbreak :退出事件循环
  • event_base_new:新建一个event_base
  • evsignal_new:新建一个event
  • event_new:新建一个event
  • event_add:将event 添加到监听的事件集
  • event_base_dispatch:开启事件循环
  • event_base_free:释放event_base
  • libevent_global_shutdown:释放所有全局资源
  • event_self_cbarg:返回event 自身作为参数,一般作为回调函数的参数

 

参考:

libevent Documentation

Linux进程间通信——使用命名管道

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误信息表示在CentOS系统的本地库中找不到所需的软件包"libverto-libevent-0.2.5-4.el7.x86_64"。 通常在CentOS系统中,使用包管理器Yum来安装和管理软件包。当我们尝试安装一个软件包时,Yum会自动解决依赖关系并下载所需的软件包。但是如果出现这个错误,意味着在本地库中没有找到所需的软件包。 解决这个问题的方法可能有以下几种: 1. 更新本地库:可以尝试更新本地库,然后再次尝试安装软件包。执行以下命令更新本地库: ``` sudo yum update ``` 2. 检查仓库配置:检查系统中是否配置了正确的仓库源。可以编辑`/etc/yum.repos.d`目录下的仓库配置文件,确保配置文件中包含了正确的软件包仓库源。 3. 安装其他版本的软件包:如果你确实需要安装这个特定版本的软件包,但是本地库中没有该版本的软件包,可以尝试安装其他可用版本的软件包。使用`yum install`命令指定其他可用版本的软件包进行安装。 4. 从其他来源安装:如果以上方法都无法解决问题,可以尝试从其他可信赖的源或第三方库中获取所需的软件包,并手动安装。 需要注意的是,在安装和更新软件包时,确保系统与网络连接正常。如果问题仍然存在,可能是由于软件包在本地库中不可用或已被移除。在这种情况下,可能需要寻找其他途径获取所需的软件包或使用其他替代解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值