- 博客(27)
- 资源 (2)
- 收藏
- 关注
转载 poll和epoll-----(转)
<br />源码解析,来自 http://donghao.org/2009/08/linuxiapolliepollaueouaeaeeio.html。<br /> 《poll和epoll内核源码剖析》(一)<br /> 《poll和epoll内核源码剖析》(二)<br /> 《poll和epoll内核源码剖析》(三)<br />epoll精髓 在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换
2010-12-30 18:00:00 550
原创 Linux下,手动加载动态库~~
<br />咳咳,在自己写的函数中加载一个动态库。<br /> <br />----头文件 #include<dlfcn.h><br /> <br />有四位伙计: dlopen(), <br /> dlsym(),<br /> dlclose(),<br /> dlerror().<br />接下来一一登场!<br /> <br />在编译时要加入 -ldl : 如: gcc test.c -o
2010-12-28 21:20:00 4311
转载 一个web请求的写法
<br />向指定的主机发送一个Web页面的请求。<br />#include <sys/types.h><br />#include <sys/socket.h><br />#include <sys/times.h><br />#include <netinet/in.h><br />#include <netdb.h><br />#include <fcntl.h><br />#include <signal.h><br />#include <unistd.h><br /
2010-12-27 21:19:00 926
原创 比较规整通用的二分查找
<br />int qsearch(void** array, size_t nr, void* data, DataCompareFunc cmp){ int low = 0; int mid = 0; int high = nr-1; int result = 0; return_val_if_fail(array != NULL && cmp != NULL, -1); while(low <= high)
2010-12-27 19:24:00 543
转载 offsetof 例子
<br />/* offsetof example */<br />#include "stdafx.h"<br />#include <stdio.h><br />#include <stddef.h><br />/************************************************************************/<br />/* Macro OBJECT_HEAD_ADDRESS : calculate the struct's address
2010-12-25 16:38:00 563
转载 offsetof
在嵌入式应用中,或许你对offsetof接触不多甚至根本没见过。如果是这样,那么从这一刻起就好好地掌握它,让它成为你的又一杀手锏吧。1. offsetof与EEPROM<br />我们许多人可能都使用过一些非挥发性的存储器,如常见的EEPROM。我们经常使用它们在存储一些系统的配置参数和设备信息。在所有的EEPROM中,通过串口访问的占了大多数。一般来说,对串口的访问都是按字节进行的,这使得我们不可避免会设计出下面的<br />接口去访问EEPROM的信息:/*从EEPROM 偏移量offset处读
2010-12-25 16:26:00 792
转载 通用性更强的双向链表
<br />#ifndef _LIST_H_<br />#define _LIST_H_<br /><br />#ifdef __KERNEL__<br />#include <linux/stddef.h><br />#else<br />#include <stddef.h><br />#endif<br /><br />#ifdef __cplusplus<br />#define list_inline inline<br />#else<br />
2010-12-25 15:08:00 600
原创 读书的方法,及基本好书。
<br />1,如果一本书的书名中带有“原理”两个字,一定不要去记忆它其中的细节,你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实现一种理论或者算法。<br />2,the it home!!~~<br /> <br />===================================================================================<br />=================================================
2010-12-22 19:55:00 630
转载 setsocketopt。。。。
<br />1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:<br />BOOL bReuseaddr = TRUE;<br />setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(BOOL));<br /><br /><br />2.如果要已经处于连接状态的socket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:<br />BO
2010-12-21 21:42:00 1043
转载 fd_set....
<br /><br />select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fe_set的内容,由此来通知执行了select()的进程哪一socket或文件可读。<br /> 多端口复用函数select在调用前要首先设置监听的端口数目,FD_ZERO是清空端口集,FD_SET是设置
2010-12-19 17:17:00 522
原创 练习
<br /><br /> <br /> 1.选择一个项目,像读书一样研读并且做笔记。归纳出好的方面和坏的方面。发表一篇评论。至少找到一个你可以借鉴的技巧或者模式。再找到至少一处缺点,提醒自己在开发软件的时候不要犯这类错误。<br />2. 挑选一个你经常重复做的工作,为它编写一个代码生成器。从简单的部分做起。不要管这个代码生成器的重复使用率,只确保这个代码生成器可以节省你的时间。<br />3.研究模型驱动架构(MDA)。尝试一些可以使用的工具。看看工作中哪里可以使用MDA概念。想想如何用你日常使用的
2010-12-19 11:56:00 383
原创 动态数组,扩充和缩小
<br /> <br />//首先是数据结构,size记录使用的空间,alloc_size记录分配的空间 data为指针的指针,为了灵活性,必须的。<br />struct _DArray<br />{<br /> size_t size;<br /> size_t alloc_size;<br /> void** data;<br />};<br />typedef struct _DArray DArray;<br /> <br />//一些接口的定义。<br
2010-12-17 21:52:00 1221
原创 strtok()
<br />好吧,下次用一定会看准原型的。<br />char * strtok(char *s,char *delim);<br /> <br />注意了,两个都是字符串。<br /> <br />首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。<br />strtok在s中查找包含在delim中的字符并用NULL('')来替换,直到找遍整个字符串。 char * p = strtok(s,";"); p = strtok(null,";"); 在调用的过程中,字串s被
2010-12-13 21:14:00 432
原创 CString,string,char*之间的转化(内部的?)
<br />CString csOne ;<br />string str;<br />char* chr;<br /> <br />csOne = str.c_str();<br />str = csOne.GetBuffer(0);<br />chr = str.c_str();
2010-12-13 21:05:00 398
原创 傻瓜版 配置samba
<br />1. 安装<br />$ sudo apt-get install samba<br />$ sudo apt-get install samba-common<br />$ sudo apt-get install samba-common-bin<br />$ sudo apt-get install system-config-samba<br />2. 配置<br />$ sudo system-config-samba<br />3. 启动<br />$ sudo smbd start
2010-12-12 15:32:00 649
原创 str.erase
<br />erase函数的原型如下:<br />(1)string& erase ( size_t pos = 0, size_t n = npos );<br />(2)iterator erase ( iterator position );<br />(3)iterator erase ( iterator first, iterator last );<br />也就是说有三种用法:<br />(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1
2010-12-10 17:42:00 1014
原创 判断一个子网掩码的合法性
<br />1,首先,保证str为小端模式。<br />2,其次,验证str转化成的IP为合法IP<br />3,(mask -1 | mask) == 0xFFFFFFFF ,如果是TRUE就是子网掩码,是FALSE就不是子网掩码。
2010-12-10 17:15:00 8552 1
原创 测试的几个问题
<br />1.每个函数只完成单一的功能。<br /> 单一功能的函数容易理解,也容易预测其行为。测试的时候,给定一些输入数据就知道它的输出和影响,易于测试。<br /> <br />2.把函数分为查询和命令两类。<br /> 查询函数只查询对象的状态,而不改变对象的状态。命令函数则只修改对象的状态,只返回其操作是否成功的标志,而不返回对象的状态。<br /> <br />3.验证输入数据,确认使用者正确的调用了函数。<br /> assert检查仅用于debug版本。<br />
2010-12-09 21:34:00 520
原创 代码量需要增加
<br />一直在调试的一个模块,问题很简单,就是有一个指针,没有检查是否指向有效地址就直接使用了,导致一直卡在一个地方。无论单线程还是多线程,无论有多么确保这个指针会指向有效的地址,用之前都要慎重,再慎重!不确定的,一定要做个检查,发出有效信息,以后调试错误,也要首先确定这些地方没有问题,在驱动中,这是致命的。<br /> <br />访问越界,多使用memcpy,strncpy,这些可以控制长度的拷贝!而且长度的选择也要慎重,至少不要越界,还有,对于C风格的字符串,有时后/0会不小心被省略,或者没有复制
2010-12-08 20:01:00 709
原创 常犯的错误,(有时间读读《COM本质论》)
1.结构体成员顺序发生变化引发的错误。struct s{ int l; char* p;};int main(int argc, char* argv[]){ struct s s1 = {4, "abcd"}; //使用struct s s1 = {.l = 4, .p = "abcd"};更好,不怕顺序发生变化 return 0;}
2010-12-05 20:02:00 615
原创 提高效率!
<br />1.编程时,我们的时间花在哪?<br /> a,需求分析,然后根据需求进行设计。<br /> b,测试……<br /> c,调试.....这个是最后一招,只有在迫不得已的情况下才使用,没有什么比一次性写好,不使用调试器更快的方法了。<br />2.解决方法。<br /> Code Review方法,比如结对编程,一个人编写程序,另一个Review输入每一行代码,前者专注于目前的细节上,后者从高层次考虑如何改进代码质量,两个人的角色会经常互换。<br /> 敲完代码最
2010-12-05 19:22:00 534
原创 Don't Repeat YourSelf (DRY)
<br />在写双向链表的打印,求和,找出最大数的时候,很明显,都是需要遍历的,因此,可以使用函数回调的方法,写一个遍历函数,留一个回调参数,呵呵,增强了代码的灵活性啊。<br /> <br />1.不要编写重复的代码。<br />有很多问题:<br /> a.虽然重复的代码很容易写,但是更容易出错。使用相类似的代码,我们更容选择使用“CV”,但是这样很容易犯一些细节上的错误,如果某个地方修改不完整,就容易留下定时炸弹!<br /> b.重复的代码经不起变化。无论是修改BUG,还
2010-12-03 20:12:00 600
原创 extern“C”
<br />见过好多次,这里记录一下<br /> <br />C++允许同名函数存在,所以编译器会对函数名重新编码。C++代码包含C语言的头文件时,重新编码名字与C语言库中的原函数名不一致,结果造成找不到函数的情况。为了让C语言实现的函数在C++中可以调用,需要在头文件中加点东西:<br /> <br /> <br />#ifdef __cplusplus<br />extern "C"{<br />#endif<br /> ...<br /> ...<br />#ifdef __cpluspl
2010-12-03 19:25:00 344
原创 这个兼容windows的Linux很吸引人哦~~毛德操先生弄得~
<br />http://www.longene.org/aboutproject.php
2010-12-03 18:41:00 1084
原创 通用的双向链表
#ifndef __STDLIST_H__#define __STDLIST_H__/** 这个通用双向链表就是一个简单的链,但是通过提供的扩展宏,可以嵌套在许多结构中* 使得相应的结构成为一个链表。* typedef struct tagMSGNODE* {* DECLARELISTNODE();* UNIT uMsg;* WPARAM wParam;* LPARAM lParam;* }MSGNODE, *LPMSGNODE;*** STD
2010-12-03 13:03:00 604
原创 藏好代码的隐私~~
<br />封装:<br />达到这样的目的,首先要能隔离变化,内部数据结构,内部使用的函数和全局变量等等,把这些代码封装起来,不会影响系统的其他部分。<br />其次降低复杂度。接口的最小化,最小化的接口容易被理解和使用,封装了细节,只暴露最小的接口,使得系统简单明了,在一定程度上降低了系统的复杂度。<br /> <br />1.隐藏数据结构,<br />对于内部数据结构,放到.c文件中,不要放到头文件中,然后,提供操作该数据结构的函数,哪怕只是存取数据结构的函数。<br /><br /><br />2.
2010-12-01 19:09:00 396
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人