存档

文章标签 ‘libevent’

学习管道pipe应用

2010年10月29日 16hot 没有评论

今天学习了pipe在进程和线程下的工作。记录一下。

int pfd[2];
if ( pipe(pfd) < 0 ) {
//出错
}

// pfd[0] 是读,pfd[1] 是写

在线程中使用管道。

void cb_func(evutil_socket_t fd, short what, void *arg)
{
const char *data = arg;

char buf_rr[ EDNSD_LOG_MAX_SIZE * 2 + 1 ];
if(read( fd, buf_rr, EDNSD_LOG_MAX_SIZE * 2 ) > 0 ) {
printf(“BUF_R: in child child process,read from the pipe is %s\n”,buf_rr);
}
}

static void
ednsd_log_server( int log_rfd )
{
struct event_base *event_base = NULL;
event_base = event_base_new();

struct event  *event;

event = event_new(event_base, log_rfd, EV_READ |EV_PERSIST, cb_func,
(char*)”Reading event”);

event_add(event, NULL);
event_base_dispatch(event_base);

}

void ednsd_log_initd()
{
int log_pfd[2];
pthread_t thread_id;
pthread_attr_t  attr;

/**
* 创建日志线程
*/

if ( pipe(log_pfd) < 0 ) {
syslog( LOG_CRIT, “pipe error” );
}

pthread_attr_init(&attr);
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );

pthread_create( &thread_id, &attr, ednsd_log_server, log_pfd[0] );

pthread_attr_destroy(&attr);
ednsd_config.log_fd = log_pfd[1];

}

分类: C/C++ 标签: , ,

libevent book

2010年10月18日 16hot 没有评论
分类: C/C++ 标签:

libevent的一些知识

2010年10月18日 16hot 没有评论

1、什么动作会触发EV_READ, 什么动作触发EV_WRITE?
2、为什么connection_accept()的eventflag有EV_PERSIST,而connection_time的没有?

通过查资料,终于搞明白了!
在《UNIX网络编程第1卷(第2版)》第6章 “I/O 复用:select和poll函数”(129页),有解释:

===============
描述字符在什么条件下准备好?
1、下列的4个条件中的任何一个满足时,socket准备好读(即有EV_READ):
a)套接口接收缓冲区中的数据字节大于等于套接口接收缓冲区低潮限度的当前值(可以设定,默认为1)
b)连接的读这一半关闭(即收到了FIN的TCP连接)。(也就是读到结尾了)
c)套接口是一个接听套接口且已完成的连接数为非0。
d)有一个套接口错误待处理。
2、下列的3个条件中的任何一个满足时,socket准备好写(即有EV_WRITE):
a)套接口发送缓冲区中的数据字节大于等于套接口发送缓冲区低潮限度的当前值(可以设定,默认为2048),且:
aa)套接口已连接 或 bb)套接口不需要连接(如UDP)
b)连接的写这一半关闭。
c)有一个套接口错误待处理。
===============

根 据刚才的time server中的例程,当client有socket连上来,应该是EV_READ,因为满足1中的c“套接口是一个接听套接口且已完成的连接数为非 0”,当该连接被acept以后,就有EV_WRITE了,因为它满足2中的a“套接口发送缓冲区中的数据字节大于等于套接口发送缓冲区低潮限度的当前 值,且套接口已连接”。所以,event_set的时候,EV_READ是有人连上来,回调函数是connection_accept(),而 EV_WRITE是在accept以后。

那EV_PERSIST呢?
EV_PERSIST,是在event发生了以后,不从队列中拿开,就是下次再有这个消息的时候,继续调那个回调函数,知道程序主动调用了event_del后,才从队列中删除--就算有那个消息也不回调函数。
connection_accept函数,只要有连接上来,就要调用的,所以它需要设置为EV_PERSIST。
但 connection_time函数,用途是在client连上来以后,给client一个返回,然后就断开连接。那它必须在连接连上了以后,只做一次, 所以不需要设置为EV_PERSIST,而且必须在accept中设置--如果没有accept就算有EV_WRITE也不应该调用它啊。

分类: C/C++, 转载 标签:

在FreeBSD 安装php-fpm 5.2.12

2010年4月2日 16hot 没有评论

php-fpm的freebsd ports只到5.2.11就没有更新了。但是其他php的扩展都升级到了5.2.12。调试程序的时候出现异常情况。就自己动手修改了php-fpm的ports配置文件。

Makefile 补丁:

— ../php5-fpm/Makefile        2009-10-13 05:53:43.000000000 +0800
+++ Makefile    2010-04-02 21:08:21.000000000 +0800
@@ -7,7 +7,7 @@

PORTNAME=      php5-fpm
PORTVERSION=   ${PHP_VERSION}
-PHP_VERSION=   5.2.11
+PHP_VERSION=   5.2.12
PHPFPM_VERSION= 0.6.3
PORTREVISION?= 0
CATEGORIES?=   lang devel www

distinfo补丁:

— ../php5-fpm/distinfo        2009-10-13 05:41:42.000000000 +0800
+++ distinfo    2010-04-02 21:13:46.000000000 +0800
@@ -1,12 +1,12 @@
-MD5 (php-5.2.11.tar.bz2) = 286bf34630f5643c25ebcedfec5e0a09
-SHA256 (php-5.2.11.tar.bz2) = 9bcd14ceda2b4bd7abcc7eb59bd74bae490d9335e4207580de783b48aa7e8f23
-SIZE (php-5.2.11.tar.bz2) = 9030787
+MD5 (php-5.2.12.tar.bz2) = 5b7077e366c7eeab34da31dd860a1923
+SHA256 (php-5.2.12.tar.bz2) = e65756a8412726a491ca48da1e0693eaeb3f38f19fb6cbc8f53005cab1f2491a
+SIZE (php-5.2.12.tar.bz2) = 9075161
MD5 (php-fpm-0.6.3.tar.bz2) = be0d67a73474f2273b8d90447d057fc2
SHA256 (php-fpm-0.6.3.tar.bz2) = 1233ce7b19c90e159474af13548541617ceead85887b201f752bc1bbbe3e4905
SIZE (php-fpm-0.6.3.tar.bz2) = 1909302
-MD5 (suhosin-patch-5.2.11-0.9.7.patch.gz) = 8f9de4d97fae6eba163cf3699509a260
-SHA256 (suhosin-patch-5.2.11-0.9.7.patch.gz) = 392f10c9b7d9c47f30e989fb7775cc46d36153b933bf7ac9ccd8826b2954584b
-SIZE (suhosin-patch-5.2.11-0.9.7.patch.gz) = 23050
+MD5 (suhosin-patch-5.2.12-0.9.7.patch.gz) = 40be1b05ad893a01778d7fb323dd8872
+SHA256 (suhosin-patch-5.2.12-0.9.7.patch.gz) = f324cf09cb83826fb35308c890ca06e14d64e5d65129f3ba8f3e61953e442366
+SIZE (suhosin-patch-5.2.11-0.9.7.patch.gz) = 23062
MD5 (php-5.2.10-mail-header.patch) = 7f73682e78d32e22989c3fb3678d668b
SHA256 (php-5.2.10-mail-header.patch) = a61d50540f4aae32390118453845c380fe935b6d1e46cef6819c8561946e942f
SIZE (php-5.2.10-mail-header.patch) = 3383

在编译安装的过程中,会报libevent错误:

../libevent/.libs/libevent.a: could not read symbols: File format not recognized
*** Error code 1

Stop in /usr/ports/lang/php5-fpm/work/php-fpm-0.6.3/src.
*** Error code 1

Stop in /usr/ports/lang/php5-fpm/work/php-fpm-0.6.3/src.
*** Error code 1

Stop in /usr/ports/lang/php5-fpm/work/php-fpm-0.6.3/src.
*** Error code 1

Stop in /usr/ports/lang/php5-fpm/work/php-fpm-0.6.3.
*** Error code 1

解决办法:

# cd work/php-fpm-0.6.3/libevent/
# make clean
# cd ../../../
# make install clean

分类: BSD/linux, PHP 标签: , ,