C++
文章平均质量分 51
屎带芬
All those whom we cherished will be reborn.
展开
-
linux 下同名符号冲突问题解决方法
最近的工作中遇到如下令人蛋疼的问题:linux 下有三个模块aa、bb、cc,基本情况如下:cc 编译连接得到 cc.so 动态库,cc 中有如下接口:cc_fun{……do();//调用名为do的cc模块内部函数……} bb 编译连接得到 bb.a 静态库,bb 中有如下接口:bb_fun{……handle = dlopen(cc.so, RTLD_LAZY);//加载cc.sopccfun = dlsym(handle, “cc_fun”);//获取cc_fun函数指原创 2010-12-15 19:18:00 · 2615 阅读 · 5 评论 -
Linux kernel 进程的睡眠和唤醒
Linux进程的睡眠和唤醒1 Linux进程的睡眠和唤醒在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux转载 2011-09-13 17:06:27 · 3841 阅读 · 0 评论 -
linux 下 kernel + kthread + 内核list + vmalloc + vfree + interruptible_sleep_on_timeout 学习实例
code:#include #include #include #include #include #include #include #include #include #include #include typedef struct tag_i原创 2011-08-26 15:52:49 · 1473 阅读 · 0 评论 -
boost regex 详解
boost::regex的默认正则表达式语法是perl语法 boost::regex支持perl regular表达式、POSIX-Extended regular表达式和POSIX-Basic Regular表达式,但默认的表达式语法是perl语法,如果要使用原创 2011-08-30 10:20:47 · 26834 阅读 · 2 评论 -
linux bash环境下面给expect脚本传递参数
#!/usr/bin/expect# file name :rauth# Usages : rauth username [ passworld ]# Description : 自动发送用户名与密码# 运行 myxrgsu -aif { $argc != 2 &&转载 2011-10-11 16:09:07 · 11442 阅读 · 0 评论 -
回调函数
回调函数调用关系图 对于第一种情况,主程序可以从执行到回调函数,也可以不执行回调函数,关键看宿主函数是否调用了回调函数。对于第二种情况,主程序可以从执行到回调函数,也可以不执行回调函数,关键看宿主函数是否调用了回调函数。主程序不知道宿主函数什么时候调用回调函数,因为调用函数启动了线程,这样,主程序就不必关心宿主函数什么时候调用回调函数了,主程序可以释放出来做自己的事了。代码示例转载 2011-11-21 17:15:28 · 1359 阅读 · 1 评论 -
Linux下IP地址格式转换(支持IPv4和IPv6)
函数inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6,原型如下 #include #include #include int inet_pton(int af, const char *src, void *dst);这个函数转换字符串到网络地址,第一个参数af是地址族,转换后存在dst中 inet_pton 是inet_addr的扩展,转载 2011-11-03 14:32:41 · 10954 阅读 · 0 评论 -
二进制操作解析
有六个位操作符,他们是: & 与 | 或 ^ 异 ~ 按位求反 >> 右移 & 与操作符 &操作符比较两个数,只有要比较的两个值的相应位都被设置(为1-译者注)时,返回的值相应位才被设置。这些比较位使用下面的表进行比较: 1 & 1 == 1 1 & 0 == 0 0 & 1 == 0 0 & 0 == 0 这个操作符理想的应用是转载 2011-12-05 13:53:22 · 994 阅读 · 0 评论 -
linux C程序中获取shell脚本输出
Table of Contents1. 前言2. 使用临时文件3. 使用匿名管道4. 使用popen5. 小结1. 前言Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作。比如实现一个ping程序来测试网络的连通性,实现ping函数需要写上200~300行代码,为什么转载 2012-01-04 13:44:19 · 645 阅读 · 0 评论 -
linux select 函数和 fd_set 用法
select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fe_set的内容,由此来通知执行了select()的进程哪一socket或文件可读。 多端口复用函数select在调用前要首转载 2012-04-09 15:24:52 · 10406 阅读 · 0 评论 -
Per-cpu 变量
1. 简介2.6内核的特性,每个处理器都拥有自己的变量副本。2. 优势每个处理器访问自己的副本,无需加锁,可以放入自己的cache中,极大地提高了访问与更新效率。常用于计数器。3. 使用相关头文件:(1) 编译期间分配声明:DEFINE_PER_CPU(type, name);避免进程在访问一个per-CPU变量时被切转载 2013-08-14 14:35:11 · 1167 阅读 · 0 评论 -
spin_lock 总结
如果被保护的共享资源只在进程上下文和软中断上下文访问,那么当在进程上下文访问共享资源时,可能被软中断打断,从而可能进入软中断上下文来对被保护的共享资源访问,因此对于这种情况,对共享资源的访问必须使用spin_lock_bh和spin_unlock_bh来保护。当然使用spin_lock_irq和spin_unlock_irq以及spin_lock_irqsave和spin_unlock_i转载 2013-09-11 14:49:37 · 716 阅读 · 0 评论 -
常用算法经典代码(C++版)
//一、快速排序void qsort(int x,int y) //待排序的数据存放在a[1]..a[n]数组中 {int h=x,r=y; int m=a[(x+y)>>1]; //取中间的那个位置的值 while(h<r){while (a[h]<m) h++; //比中间那个位置的值小,循环直到找一个比中间那个值大的 while (a[r]>m) r--; /转载 2014-02-17 13:47:40 · 5871 阅读 · 0 评论 -
通过valgrind 输出的偏移地址定位源码行号
有时用valgrind定位内存泄露问题时当内存泄露的位置在动态库(so)中时, 输出的调用栈为问号"???"并且没有指明源码的行号.即使尝试了加 -g 的编译参数并且程序退出前不执行dlclose,也无济于事.==29941== 17 bytes in 1 blocks are definitely lost in loss record 29 of 197==29941== at原创 2015-01-28 13:33:56 · 6148 阅读 · 2 评论 -
c++ 读写文件安全又简洁的方法
#include #include #include using namespace std;int get_file_content(string sFileName, string& sFileContent);int main(int argc, char*原创 2011-08-30 14:11:09 · 1464 阅读 · 0 评论 -
解析IPV4报文 和IPV6 报文的 checksum 的算法
校验和(checksum)算法,简单的说就是16位累加的反码运算:计算函数如下:我们在计算时是主机字节序,计算的结果封装成IP包时是网络字节序,注意这两者之间的区别,我们在从IP包里读取要转化为主机字节序,往IP包里存入时要转化为网络字节序在存入。UINT转载 2011-08-10 16:44:04 · 9016 阅读 · 1 评论 -
任意类型数的bit位操作
#include typedef int type;void binary_type(type number, int binary[]){ int len = 8 * sizeof(type); int k = len -1; int j =转载 2011-08-10 16:42:17 · 917 阅读 · 0 评论 -
发布 eclipse 插件的方法
<br /><br />如果想把调试好的插件打包发布,并且在ECLIPSE中可以使用.<br />1.File-->Export<br />2.选择 PLug-in Development下 的 Deployable plug-ins and fragments<br />3.进入 Deployable plug-ins and fragments 页面<br />4.把底下的 Destubatuib 的选项中选择 Archive file 在这里添入要存入的名称.<br /> <br />最后生成ZIP文转载 2011-02-15 15:05:00 · 2205 阅读 · 0 评论 -
将本机文件夹映射为磁盘的方法
<br /><br />将C:/test映射为磁盘x:<br />subst x: C:/test<br /> <br />解除映射:<br />subst x: /d原创 2011-03-04 16:45:00 · 1119 阅读 · 0 评论 -
Google C++ Style Guide
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml转载 2011-03-08 17:30:00 · 1362 阅读 · 0 评论 -
C++宽字符与普通字符的转换方法
<br />//把字符串转换成宽字符串wstring string2Wstring(string sToMatch){ #ifdef _A_WIN int iWLen = MultiByteToWideChar( CP_ACP, 0, sToMatch.c_str(), sToMatch.size(), 0, 0 ); // 计算转换后宽字符串的长度。(不包含字符串结束符) wchar_t *lpwsz = new wchar_t [iWLen + 1]; MultiBy原创 2011-03-31 21:23:00 · 11840 阅读 · 8 评论 -
C++中过长的 string 转为 _bstr_t 失败问题的解决方法
bool CElement::LoadXML(std::string const & xml, int depth){ try { _bstr_t bstrXmlSum = ""; bstrXmlSum = xml.c_str();//编程实践中,当xml为5百多K的时候,这一句会抛出异常 return RawLoadXML(bstrXmlSum, depth); } catch (...) { Log("解析 XM原创 2011-04-01 19:47:00 · 2801 阅读 · 0 评论 -
vi Unknown terminal type 的问题解决方法
linux: Unknown terminal typeI dont know what kind of terminal you are on - all I have is linux.[Using open mode]在linux上跑screen,登录到solaris上,使用vi,就报上面的错误。搜了一下-bash-3.00$ echo $TERM linux-ba原创 2011-06-21 16:23:00 · 8387 阅读 · 0 评论 -
linux 内核开发-重构skb
测试环境: CentOS5.3 2.6.18工具: sendip和wireshark sendip可以发送各种数据包,确实方便.wireshark图形化的显示对于分析整个数据包还是相当不错的... 一:内核态基于Netfilter构造数据包主要有两种方式:1. alloc_skb申请一个skb结构体,然后根据实际的应用填充不同的成员,或者基于当前数据包的skb, 调用skb_c转载 2011-06-28 14:39:00 · 3338 阅读 · 0 评论 -
在Linux下正则表达式和grep命令的使用
grep语法:[root @test /root ]# grep [-acinv] '搜寻字符串' filenames-list参数说明:-a :将 binary 文件以 text 文件的方式搜寻数据-c :计算找到 '搜寻字符串' 的次数-i :忽略大小写的转载 2011-07-06 09:39:02 · 578 阅读 · 0 评论 -
Linux字符设备驱动程序编写基本流程
linux 字符设备 驱动程序转载 2011-07-06 09:10:12 · 3540 阅读 · 0 评论 -
linux 内核(驱动)常用函数
2.4.1 内存申请和释放 include/linux/kernel.h里声明了kmalloc()和kfree()。用于在内核模式下申请和释放内存。 void *kmalloc(unsigned int len,int priority); void kfree(void *__ptr); 与用户模式下的malloc()不同,kmalloc()申请空间有大小限制。长度是2的转载 2011-06-30 09:41:00 · 4809 阅读 · 0 评论 -
setjmp 与 longjmp
setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。先来看一下这两个函数的定义吧:setjmp和longjmp的函数原型在setjmp.h中转载 2011-07-29 17:26:49 · 3081 阅读 · 0 评论 -
linux 内核调试
内核中有多项用于调试的功能,但这些功能会造成额外输出,并导致性能下降,因此发行版本厂商通过都禁止发行版内核中的这些功能。但作为一名内核开发者,调试需求具有更高的优先级,因此应该构造并安装自己的内核,并打开这些调试选项。一、内核中的调试选项CONFIG_DEBUG_转载 2011-08-10 11:00:39 · 1896 阅读 · 0 评论 -
掌握 Linux 调试技术
本文讨论了四种调试 Linux 程序的情况。在第 1 种情况中,我们使用了两个有内存分配问题的样本程序,使用 MEMWATCH 和 Yet Another Malloc Debugger(YAMD)工具来调试它们。在第 2 种情况中,我们使用了 Linux 中的 strace 实转载 2011-08-10 11:04:11 · 516 阅读 · 0 评论 -
不同情况下构造skb数据包的实现
在我这个网络接口的程序中(can0),其实难点就是怎样组包。怎样在原来数据包的基础加上自己的数据,怎样构造ip头,怎样构造udp头。调试了两个星期,终于是调通了,在这个过程中,通过看内核源代码和自己组包的尝试,大概对组包的方法有了些了解,记录在此,留做备忘,也希望能给需要转载 2011-08-10 16:46:40 · 1394 阅读 · 0 评论 -
字节对齐注意事项
对齐准则 先来看四个重要的基本概念: 1) 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。 2) 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。 3) 指定对齐值:#pragma pack (value)时的指定对齐值value。转载 2016-02-25 11:14:52 · 1530 阅读 · 0 评论