用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
rstevens的公告
1、记录技术成长历程。 <hr> 2、关注基于 Linux 的,适用于移动终端的软件开发平台及相关技术。 <hr> 3、关注提高性能的技术 <hr> 欢迎各位网友与我讨论交流: <hr> rstevens2008 AT gmail.com <hr> rstevens2008 AT hotmail.com <hr> <a href="http://www3.clustrmaps.com/counter/maps.php?url=http://blog.csdn.net/rstevens" id="clustrMapsLink"><img src="http://www3.clustrmaps.com/counter/index2.php?url=http://blog.csdn.net/rstevens" style="border:0px;" alt="Locations of visitors to this page" title="Locations of visitors to this page" id="clustrMapsImg" onError="this.onError=null; this.src='http://www2.clustrmaps.com/images/clustrmaps-back-soon.jpg'; document.getElementById('clustrMapsLink').href='http://www2.clustrmaps.com'" /> </a> <h3>Google</h3> <script language="javascript"> function search () { var q=document.getElementsByName("q")[0].value; var link="http://www.google.com/custom?domains=" + website + "&sa=Search&sitesearch=" + website + "&ie=UTF-8&oe=UTF-8&hl=zh-CN" + "&q=" + q ; window.open(link); } </script> <script language="javascript"> var website="http://blog.csdn.net/rstevens"; </script> <input type="text" name="q" /> <input type="button" value="Google本站" onclick="javascript:search()"/> <script type="text/javascript" src="http://del.icio.us/feeds/js/tags/rstevens2008?icon=20;size=12-35;color=990000-0000ff"></script> <h3>最近更新</h3> <ul class="list" id="my_last_post"></ul><ul class="list"><li> <script type="text/javascript"><!-- var xmlhttp = false; function load_rss() { xmlhttp = false; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); if (xmlhttp.overrideMimeType) { xmlhttp.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject(" Microsoft.XMLHTTP"); } catch(e) { } } } if(!xmlhttp) { return; } xmlhttp.onreadystatechange = proc_rss; xmlhttp.open('GET', '/rstevens/rss.aspx', true); xmlhttp.send(null); } function proc_rss() { if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) { var items = xmlhttp.responseXML.getElementsByTagName ('item'); var l = 8; if(items.length < 8) { l = items.length; } var html = ''; for (var i = 0; i < l; i++) { html = html + get_item(items, i); } var obj = document.getElementById('my_last_post'); if(obj) { obj.innerHTML = html; } } } } function get_item(items, id) { var link = items[id].getElementsByTagName('link').item(0).firstChild.nodeValue; var title = items[id].getElementsByTagName('title').item(0).firstChild.nodeValue; var item = '<li ><a href="' + link + '">' + title + '</a></li>'; return item; } load_rss(); //--> </script> <script src="http://club.book.csdn.net/people/javascript/rstevens2.js"></script> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> </script> <script type="text/javascript"> _uacct = "UA-3778343-1"; urchinTracker(); </script>
文章分类
1. Friendly Link
absurd(RSS)
Brad Abrams
fmddlmyy的专栏
fudan_abc的专栏(RSS)
holub
KangHua 的专栏
Krzysztof Cwalina
一个叫搜索引擎的家伙
云风的博客
刘未鹏的博客
博客园培训团队
周爱民的博客
开源电信-黄思源的博客
手机开发网
苏鹏的博客
许式伟的专栏(RSS)
透明思考 -- 熊节的博客
项立刚的博客(中国通信业知名观察家)
4. Techinique Resource
del.icio.us
developerWorks Linux 专栏
http://www.rapidshare.com/
OSDN
图书下载
英特尔® 软件网络
存档

原创  使用 libevent 容易犯的一个错误 收藏

使用 libevent 的一个代码片段如下:
  1. struct event ev_accept;
  2. event_set(&ev_accept, listen_fd, EV_READ|EV_PERSIST, on_accept, NULL);
  3. event_add(&ev_accept, NULL);

这段代码是错误的,因为 ev_accept 是在栈上分配的临时变量,但是 ev_accept 实际上是要求在整个程序的生命期中都有效的,且看 libevent 文档中的描述:

 

Event notification
For each file descriptor that you wish to monitor, you must declare an event structure and call event_set() to initialize the members of the structure. To enable notification, you add the structure to the list of monitored events by calling event_add(). The event structure must remain allocated as long as it is active, so it should be allocated on the heap. Finally, you call event_dispatch() to loop and dispatch events.

 

用这种错误的方式,如果内存不被破坏,不一定会出现问题,也就是说,这个错误导致的问题会很隐蔽

 

正确的方式是:

  1. struct event *ev_accept = (struct event*)malloc(sizeof(struct event));
  2. event_set(ev_accept, listen_fd, EV_READ|EV_PERSIST, on_accept, NULL);
  3. event_add(ev_accept, NULL);

实际上导致这个问题出现的原因也很可笑,因为 libevent 自带的 example 程序中就是用的错误的方法,从而毒害了一大批人

发表于 @ 2008年10月10日 17:36:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:对 C++ 引用的理解 | 新一篇:socket 编程中出现的两个情况及原因分析

  • 发表评论
  • 评论内容:
  •  
Copyright © rstevens
Powered by CSDN Blog