功能:
主线程同时监听定时器事件和IO事件,工作线程简单的监听IO事件。
主线程每隔一秒种向工作线程发送一条字符串信息
工作线程显示该信息并回显给主线程
该示例演示了主线程如何同时监听多个事件。
Makefile
- eventtest : eventtest.c
-
gcc -Wall -g -levent -lpthread -o eventtest eventtest.c
-
.PHONY : clean
-
clean :
-
rm eventtest -f
eventtest.c
- #include <stdio.h>
-
#include <stdlib.h>
-
#include <unistd.h>
-
#include <pthread.h>
-
-
#include <sys/types.h>
-
#include <sys/socket.h>
-
-
#include <event.h>
-
-
-
struct event_base *workerbase;
-
int fd[2];
-
-
static void
-
thread_libevent_process(int fd, short which, void *arg)
-
{
-
int ret;
-
char buf[128];
-
-
ret = read(fd, buf, 128);
-
if (ret > 0) {
-
buf[ret] = '\0';
-
printf("thread receive message : %s\n", buf);
-
}
-
-
sleep(1);
-
-
write(fd, buf, ret);
-
-
-
return;
-
}
-
-
static void *
-
worker_thread(void *arg)
-
{
-
int fd = *(int *)arg;
-
-
struct event ev;
-
-
event_set(&ev, fd, EV_READ | EV_PERSIST, thread_libevent_process, NULL);
-
event_base_set(workerbase, &ev);
-
event_add(&ev, 0);
-
-
event_base_loop(workerbase, 0);
-
-
-
return NULL;
-
}
-
-
static void
-
main_event_process(int fd, short which, void *arg)
-
{
-
int ret;
-
char buf[128];
-
-
ret = read(fd, buf, 128);
-
if (ret > 0) {
-
buf[ret]='\0';
-
printf("main thread receive echo message : %s\n", buf);
-
}
-
-
-
return;
-
}
-
-
static void
-
timeout_cb(int fdd, short event, void *arg)
-
{
-
struct timeval tv;
-
struct event *timeout = arg;
-
-
write(fd[0], "Hello world!", sizeof("Hello world!") - 1);
-
-
evutil_timerclear(&tv);
-
tv.tv_sec = 1;
-
event_add(timeout, &tv);
-
}
-
-
int
-
main (int argc, char *argv[])
-
{
-
int ret;
-
-
pthread_t tid;
-
-
struct event ev;
-
struct event evtimeout;
-
struct timeval tv;
-
-
struct event_base *base;
-
-
base = event_init();
-
if (base == NULL) {
-
perror("event_init( base )");
-
return 1;
-
}
-
-
workerbase = event_init();
-
if (workerbase == NULL) {
-
perror("event_init( workerbase )");
-
return 1;
-
}
-
-
-
-
ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, fd);
-
if (ret == -1) {
-
perror("socketpair() : ");
-
return 1;
-
}
-
-
-
event_set(&ev, fd[0], EV_READ | EV_PERSIST, main_event_process, NULL);
-
event_base_set(base, &ev);
-
event_add(&ev, 0);
-
-
evtimer_set(&evtimeout, timeout_cb, &evtimeout);
-
event_base_set(base, &evtimeout);
-
evutil_timerclear(&tv);
-
tv.tv_sec = 1;
-
event_add(&evtimeout, &tv);
-
-
ret = pthread_create(&tid, NULL, worker_thread, (void *)&fd[1]);
-
if (ret != 0) {
-
perror("pthread_create()");
-
return 1;
-
}
-
-
-
event_base_loop(base, 0);
-
-
-
return 0;
-
}
阅读(11316) | 评论(0) | 转发(0) |