01 2013 档案
摘要:转载自:http://smilejay.com/2012/08/kvm-vcpu-binding/通常情况下,在SMP系统中,Linux内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个CPU上执行。一个进程在前一个执行时间 是在cpuM(M为系统中的某CPU的ID)上运行,而在后一个执行时间是在cpuN(N为系统中另一CPU的ID)上运行。这样的情况在Linux中是 很可能发生的,因为Linux对进程执行的调度采用时间片法则(即进行用完自己的时间片即被暂停执行),而默认情况下,一个普通进程或线程的处理器亲和性 是在所有可用的CPU上,有可能在它们之中的任何一个CPU(包括超线程)
阅读全文
摘要:KVM:a virtual CPU is a thread in the qemu-kvm process. qemu-kvm is of course multithreaded. unless you pin processes to specific CPUs, the system scheduler will allocate the threads CPU time from the available cores, meaning, any vCPU can end up getting CPU cycles from any physical core, unless spe.
阅读全文
摘要:年底需要修改一次密码,修改的时候遇到了问题,无法修改密码,经过baidu 、google,找到了可能引起的原因,成功修改密码。以下内容来自于网络。Authentication token manipulation error发生该错误原因是:1、分区没有空间导致。2、/etc/passwd 和/etc/shadow不同步但是这次上面两条却行不通,通过df查看根分区还有40%剩余。1、尝试修改密码,出现错误# passwdChanging password for user root.New UNIX password: BAD PASSWORD: it is WAY too shortRety
阅读全文
摘要:Python 实现线程式编程非常简单,但是这种方法的一个缺陷就是它并不总是能够提高应用程序的速度,因为全局解释器锁(Global Interpreter Lock,GIL)将线程有效地限制到一个核中。如果需要使用计算机中的所有核,那么通常都需通过 对 经常使用 fork 操作来实现,从而提高速度。处理进程组是件困难的事情,因为为了在进程之间进行通信,需要对所有调用进行协调,这通常会使事情变得更复杂。幸运的是,自 2.6 版本起,Python 包括了一个名为 “多进程(multiprocessing)” 的模块来帮助处理进程。该进程模块的 API 与线程 API 的工作方式有些相似点,但是也存在
阅读全文
摘要:最近稍微学习了下python中的paramiko这个模块,发现他的功能还是很强大的,他的上传和下载功能十分适合运维人员的一些日常工作的需要,不 废话了,下面直接上代码了,先说下环境,本文是在centos6的环境下,python的版本是2.6.5,如果你没配好环境,可以看我写的http://www.50rescue.com/index.php/archives/10/ 这里来配置好环境,建议你一定要按照好easy_inatall这个工具,在学习中,感觉离不开她 了,呵呵。。。。贴别提醒:论坛的编辑器我不太会使用,我把源代码复制在文本文件里,传了上来,需要的可以下载:下面是上传的代码:[root@
阅读全文
摘要:1. cat 一个文件2. 用expect3. 用echo例子以后补充有关passwd命令在前面,我们提到passwd程序在缺乏用户交互的情况下,不能运行,passwd会忽略I/O重定向,也不能嵌入到管道里边以便能从别的程序或者文件里 读取输入。这个程序坚持要求真正的与用户进行交互。因为安全的原因,passwd被设计成这样,但结果导致没有非交互式的方法来检验passwd。
阅读全文
摘要:、chpasswd 命令管理用户的密码。Root 用户能够通过标准输入提供或更改指定的用户密码。输入的每一行必须是以下格式。 usename:password2、使用root用户登录后,输入命令: echo "用户:新密码" |chpasswd 回车; 就可以把修改密码了。 3、如果是普通用户,没有chpasswd的权限,可以对命令文件/usr/sbin/chpasswd赋予权限。 使用root用户对/usr/sbin/chpasswd赋予权限: chmod 4755 /usr/sbin/chpasswd ; 这样普通用户就可以有自动修改密码的权限 注,普通用户使用sudo
阅读全文
摘要:组合不用继承多余的函数。由此可见,组合比继承具有更大的灵活性和更稳定的结构,一般情况下应该优先考虑组合。只有当下列条件满足时才考虑使用继承:子类是一种特殊的类型,而不只是父类的一个角色子类的实例不需要变成另一个类的对象子类扩展,而不是覆盖或者使父类的功能失效最后还说一句,“优先使用对象组合,而不是继承”是面向对象设计的第二原则。但并不是说什么都设计都用组合,只是优先考虑组合,更不是说继承即使不好的设计,应该用组合,应为他们之间也有各自的优势。下面是他们之间的优缺点比比较表:组 合 关 系继 承 关 系优点:不破坏封装,整体类与局部类之间松耦合,彼此相对独立缺点:破坏封装,子类与父类之间紧密耦.
阅读全文
摘要:实例代码:// test1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <string.h>#include <string>#include <memory>#include <list>#include <iostream>using namespace std;using namespace std::tr1;class CInt: public enable_shared_fr
阅读全文
摘要:1: #include <list> 2: #include <string> 3: #include <functional> 4: #include <iostream> 5: 6: struct S { 7: std::string firstname; 8: std::string secondname; 9: int ID; 10: // 重新定义小于,因为默认的sort函数调用的操作符是<,所以我们只需要重载 < 就好了 11: ...
阅读全文
摘要:转载自http://www.searchtb.com/2012/08/zeromq-primer.html写的比较好,深入骨髓了:一、ZeroMQ的背景介绍引用官方的说法: “ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是 “成为标准网络协议栈的一部分,之后进入Linux内核”。现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接 字之上的一 层封装。ZMQ让编写高性能网络
阅读全文
摘要:除了std::tr1::bind,另外有一个boost::bind,这个应该与boost中其他的数据结构结合的很紧。后者好像用的更多。(boost::function和boost::bind已经纳入了std::tr1,所以这两者应该是一样的)bind使用形式bind(&f)() 假设f是一个全局函数,绑定全局函数并调用bind (&A::f, A())() 假设A是一个构造函数为空的类,这个形式绑定了类的成员函数,故第二个参数需要传入一个成员。(成员静态函数除外)bind (&A::f, _1)(new A()) 同上,效果是一样的,但是使用了占位符,使得没有固定的的对
阅读全文
摘要:1.遍历方法for(xml_node<> *node = doc.first_node(); node; node = node->next_sibling()){ printf("node:%s value:%s\n", node->name(), node->value()); }
阅读全文
摘要:char *s[] = { "aaa", "bbb" }获得这个s的中包涵的字符串个数: sizeof(s)/sizof(s[0])
阅读全文
摘要:1.空的智能指针 假设如此定义typedef shared_ptr<int> IPtr; 返回为空可以设计为 IPtr f() { return IPtr(); } 测试是否为空,一般可以使用get() 返回其包裹的原指针测试是否为空,在上面的设计中,也可以直接看 IPtr i_p = f(),用!i_p来判断是否为空2. 类中也可以如此获得指向自己的智能指针 IPtr(this)
阅读全文
摘要:转载自:http://qz.qq.com/4439401/blog?uin=4439401&vin=0&blogid=1335593811条款1:不要把一个原生指针给多个shared_ptr管理int* ptr = new int;shared_ptr<int> p1(ptr);shared_ptr<int> p2(ptr); //logic errorptr对象被删除了2次这种问题比喻成“二龙治水”,在原生指针中也同样可能发生。条款2:不要把this指针给shared_ptrclass Test{public:void Do(){ m_sp = sha
阅读全文
摘要:1.若节点使用瞬时节点,如何把任务通知到节点?2.如何更新虚拟机的状态信息?
阅读全文
摘要:转载自:http://www.cnblogs.com/panfeng412/archive/2012/07/29/storm-stream-model-analysis-and-discussion.html本文首先介绍了Storm的基本概念和数据流模型,然后结合一个典型应用场景来说明Storm支持Topology之间数据流订阅的必要性,最后对比了Storm与另一个流处理系统在数据流模型上的区别之处。Storm基本概念Storm是一个开源的实时计算系统,它提供了一系列的基本元素用于进行计算:Topology、Stream、Spout、Bolt等等。在Storm中,一个实时应用的计算任务被打包作
阅读全文
摘要:1.尽量保持别人接口的语义,最好不要限制,或者扩大,除了核心你要封装的参数。 int zoo_exists(zhandle_t *zh, const char *path, int watch, struct Stat *stat); 可以设计为: int32_t IsExists(const string& path, int32_t watch = 0, struct Stat *stat = NULL) 其中 zhandle_t 这个核心的参数作为类的变量了,其余的参数尽量不要改,可以保持其语义的丰富以及完整,否则你就需要多写几个IsExists的特殊话接口了。有必要的时候才这么
阅读全文
摘要:区别:1.引用不能指向空对象。 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。2.应用的对象一旦初始化就不能改变。总结:1.当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。2.引用并不能完全消除指针。
阅读全文
摘要:转载自:http://blog.yufeng.info/archives/2456前几天 纯上 同学问了一个问题:我ps aux看到的RSS内存只有不到30M,但是free看到内存却已经使用了7,8G了,已经开始swap了,请问ps aux的实际物理内存统计是不是漏了哪些内存没算?我有什么办法确定free中used的内存都去哪儿了呢?这个问题不止一个同学遇到过了,之前子嘉同学也遇到这个问题,内存的计算总是一个迷糊账。 我们今天来把它算个清楚下!通常我们是这样看内存的剩余情况的:$free-mtotal usedfreeshared buffers cachedMem: 48262 7913 4
阅读全文
摘要:Conv.hA variety of data conversion routines (notably to and from string), optimized for speed and safety。这个我用的到Foreach.h这个应该也会有用处的,好好看看。Format.h这个好像就是按照格式的输入以及输出,与sprintf很类似,但是它比sptrinf快,同样的是type-safe。另外,可以支持动态类型。
阅读全文
摘要:目前正在考虑一个单机事件处理系统的架构设计,来完成一个基于事件驱动的系统。为什么要单独设计一个事件处理系统?1 ) 容错 考虑一个场景,你添加了一个物理机器,想要上报给一个master,但是因为什么原因,无法上报,但是物理机确实已经创建了,你现在怎么办。为了保持一致性,最好的方式是缓存这个事件,然后隔一段事件继续上报。这个就是单独的事件处理系统可以帮你做的事情。2) 容易审计 所有事件都被集中处理了,特别方便进行安全以及统计处理。3) 容易扩展 方便的事件注册/处理。新增事件特别容易。目前有两个架构在考虑中:1) 有event dispatcher 类 每种事件,你运行之前需要注册一种事件类.
阅读全文
摘要:Hadoop 0.23中使用了基于事件驱动机制的异步编程模型。每个对象都是一个有限状态机,有相应的事件处理器(EventHandler),处理器处理对应的事件类型。事件处理后,对象将从一个状态变化到另一个状态。以Application对象为例,相关类分别为:状态类:ApplicationState处理器类:Application事件类型类:ApplicationEventType事件类:ApplicationEvent及子类其状态机如下图:状态机框架框架中的泛型OPERAND表示状态机的操作对象,如Application对象。STATE表示对象的状态,如ApplicationState代表的相
阅读全文
摘要:多用组合,少用继承。组合:是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能。也就是在一个类中直接使用另外一个类。继承:是类 D 的对象可以使用仅对类C的对象有效的方法或者属性的特性,它使得这些方法和属性就好像是由类 D 定义的。普通的继承语义。类应该对扩展开放,对修改关闭。具体有待丰富
阅读全文
摘要:查找文件夹下包含字符串的文件例:查找/usr/local目录下所有包含”rubyer.me”的文件。1grep -lr 'rubyer.me' /usr/local/*vim替换单个文件中所有字符串方法例:替换当前文件中所有old为new1:%s/old/new/g2#%表示替换说有行,g表示替换一行中所有匹配点。替换文件夹下包含字符串的文件sed结合grep 例:要将目录/www下面所有文件中的old都修改成new,这样做:1sed -i "s/old/new/g" `grep old -rl /www`-i 表示直接修改文件,后面的`grep ...`表
阅读全文
摘要:写脚本时,经常要判断字符串是否相等,检查文件状态或是数字测试等。Shell提供了对字符串、文件、数值及逻辑操作等内容的条件测试的支持。1.测试文件状态test一般有两种格式,即:test condition或[ condition ]使用方括号时,要注意在条件两边加上空格。一般采用第2种方式,比较方便。测试文件状态的条件表达式很多,下面是一个常用的文件状态列表。文件状态测试-a 文件存在-b 文件存在并且是块文件-c文件存在并且是字符文件-d文件存在并且是目录-s 文件长度大于0、非空-f 文件存在并且是正规文件-w文件存在并且可写-L文件存在并且符号连接-u 文件有suid位设置-r文件存在
阅读全文
摘要:在zookeeper中所有的读操作getData(), getChildren() 和 exists() 可以有一个选项设置一个观察(watch)。一个观察是一个单次的触发器,当这个观察设置的数据发生变化的时候,客户就会接到一个通知。以下是几个比较重要的点: 单次的触发: 如果一个客户做了getData("/znode1", true),然后/znode1的数据被改变了或者删除了,该客户就会得到一个观察事件。如果/znode1的数据又被改变了,这个客户将不会再收到通知,除非它再次进行读操作,并设置一个新的观察。 发送到客户: Zookeeper提供了一致性保证:一个客户首先
阅读全文
摘要:本文大部分翻译自: http://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html引言: Zookeeper主要为分布式程序提供一致性协调服务。Zookeeper数据模型: Zookeeper有一个分层的命名空间,很像一个分布式文件系统。与文件系统唯一的不同的是在系统中的每个节点可以包含数据和子节点。Znodes:en 在Zookeeper树中的每一个节点被称作为znode,znode维护了一个状态结构,其中包括数据变化的版本号,ccl变化,时间戳。每次数据改变之后,版本号就会增加。。每次客户更新数据的时候,也必须提供原数据的版
阅读全文
摘要:转载自:http://blog.csdn.net/poechant/article/details/6675431参考:Java端的API:http://zookeeper.apache.org/doc/r3.3.4/api/index.html另外,zookeeper源码中的cli_mt源码提供了很好的例子,最后有问题必须参照这个文件。1. zookeeper初始化zhandle_t*zookeeper_init(constchar*host,watcher_fnfn,intrecv_timeout,constclientid_t*clientid,void*context,intflags
阅读全文
摘要:本文转载自:http://blog.csdn.net/poechant/article/details/6650249zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg。其中各配置项的含义,解释如下:1.tickTime:CS通信心跳数Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。tickTime=20002.initLimit:LF初始通信时限集群中的follower服务器(F)与leader服务器(L)之间初始连接
阅读全文
摘要:h2 database 是一个开源免费的Java SQL内存数据库。数据库分为嵌入式(Embedding)和Server模式。持续关注中...
阅读全文
摘要:原文:http://www.blogjava.net/killme2008/archive/2011/11/17/364112.html 作者:dennis (killme2008@gmail.com) 转载请注明出处。 最近一直在读twitter开源的这个分布式流计算框架——storm的源码,还是有必要记录下一些比较有意思的地方。我按照storm的主要概念进行组织,并且只分析我关注的东西,因此称之为浅析。 一、介绍 Storm的开发语言主要是Java和Clojure,其中Java定义骨架,而Clojure编写核心逻辑。源码统计结果:180textfiles.177uniquefiles.7.
阅读全文
摘要:Clojure(发音类似 "closure") 是一套现代的 Lisp 语言的动态语言版。Clojure 可以执行于Java虚拟机器之上。一方面客户以及董事们对于工业级别的标准平台如JVM投入了大量的资金,并且对于它的性能,安全性,稳定性都很满意。另一方面java工程师也很羡慕动态语言的简洁,灵活以及开发效率,他们也希望这些动态语言能运行在客户/董事们所期望的平台上,可以访问那些已经很成熟的java类库,并且性能还应该不错;他们要用原始的线程、锁来编写多线程程序。clojure就是一个为了满足这些需求的一个尝试: 一个运行在JVM上的动态语言。它可以被使用在java适合的那
阅读全文
摘要:下载地址:http://sourceforge.net/projects/katta/files/katta/目前最新版本是0.6.41. 下载katta-core-0.6.4.tar.gz 即可2. 将文件解压3. 进入文件夹4.开三个shell窗口,分别运行第一个shell,开启masterbin/katta start Master第二个shell,开启节点(slave)bin/katta start Node第三个shell,存取数据测试bin/katta addIndex testIndex src/test/testIndexA 2 命令含义是 addIndex <index
阅读全文
摘要:暂时不太明白,先转过来,转载自http://blog.sina.com.cn/s/blog_539d361e0100op7c.htmlKatta使用ZkClient和ZKServer通讯,调用顺序一般是:Katta->ZKClient->ClientCnxn->NIOServerCnxn->ZKServer,具体结构如下:1. 连接: a)ZkClient、ClientCnxn和Katta处于同一个实例中,和ZkServer通过Socket通讯; b)ClientCnxn发起socket连接后,ZkServer的Factory实例化一个NIOServerCnxn,持有一
阅读全文
摘要:IntroKatta is a distributed application running on many commodity hardware servers very similar to Hadoop MapReduce, Hadoop DFS, HBase, Bigtable or Hypertable.OverviewA master server manages nodes and index shard assignment. Nodes serve index shards. A client is allowed to search within an index by
阅读全文
摘要:zookeeper介绍zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据google发表的论文来实现的,接下来我们首先来安装使用下这个软件,然后再来探索下其中比较重要一致性算法。 zookeeper安装和使用zookeeper的安装基本上可以按照 http://hadoop.apache.org/zookeeper/docs/current/ zookeeperStarted.html 这个页面上的步骤完成安装,这里主要介绍下部署一个集群的步骤,因为这个官方页面似乎讲得并不是非常详细(Running Replicated Zookee.
阅读全文
摘要:出自:http://www.makelinux.net/kernel_map/
阅读全文
摘要:SPDY 是 Google 开发的基于 TCP 的应用层协议,是对 HTTP 协议的增强。设计 SPDY 的目的在于降低网页的加载时间。是HTTP 2.0的草稿,据说将在2014年定稿,持续关注中
阅读全文
摘要:这个是由于HDFS被异常关闭之后造成数据库的不一致状态而造成的:1)等当然,这个是最安全的方式,如果等了太长时间仍处于这个状态,尝试下面的方法2)强制退出安全模式,hadoop dfsadmin -safemode leave这种方式虽然快,但会有遗留问题,然后你就用"hadoop fsck /" 工具慢慢修复吧1)删除tmp文件目录下的所有的文件,重新format这种方式非常暴力,所有的数据均没有了
阅读全文
摘要:报出这个错误的原因是无法像HDFS写信息,可能是你重新初始化了HDFS,立马就运行了jobtracker。解决办法就是,等一段时间,等HDFS初始化成功即可。
阅读全文
摘要:var=${str-expr} var=${str:-expr}var=${str+expr}var=${str:+expr}var=${str=expr}var=${str:=expr}var=${str?expr}var=${str:?expr}没有怎么弄懂 TODO
阅读全文
摘要:$$ 含义: 表示运行当前脚本的pid 例子: echo "current pid: $$"\ 含义:字符串中的转义符号 例子: echo "\$\$ is used to get pid: $$"$@ 和 $* 含义:表示所有的参数 例子: echo "all arg: $*" 或者 echo "all arg: $@" 两者的区别在于$@比$*更高级,它不使用IFS环境变量,所以即使IFS为空,参数也不会挤在一起,故推荐用$@$+数字 含义:运行脚本的参数 例子:echo "cmd: $0 $1&qu
阅读全文
摘要:目前来说有三种方法: 1. 脚本绝对路径 这个方式是最普通的,底层调用的是fork实现,运行的时候开一个子shell执行调用的脚本,子shell执行的时候,父shell还在 子shell执行完毕后返回父shell,子shell从父shell继承环境变量,但是子shell中的环境变量不会带回父shell中 2. 句号 + 脚本绝对路径 底层调用的是source实现的,他于fork的区别是不新开一个子shell来执行被调用的脚本,而是在同一个shell中执行,所以被调用脚本中申明的变量和环境变量,都可以在主脚本中得到和使用 2. exec + 脚本绝对路径 exec与fork不同,不需要新开一个子
阅读全文
摘要:1. DLOG(WARNING) 不能正确的写到warning文件中,反而写到了info文件中。 会不会是fork的时候造成的问题? 初始化glog相关代码 m_pid = fork(); if(m_pid == 0) { CloseInheritedFD(); //DLOG(WARNING) << } //DLOG(WARNING) <<注意是这个issue:http://code.google.com/p/google-glog/source/detail?r=942. glog 与 repid xml一起使用的时候,会出现诡异的问题,是不是内存被弄坏了?
阅读全文
摘要:LXC 使用 cgroup 文件系统来管理容器。在使用 LXC 之前,首先必须挂载这个文件系统:mount -t cgroup cgroup /cgroup。可以将 cgroup 文件系统挂载到任何地方。LXC 将使用 /etc/mtab 中挂载的第一个 cgroup 文件系统。(ubuntu11.10安装libvirt之后会自动挂在到/sys/fs/cgroup,无需手工操作)LXC 文档:http://lxc.sourceforge.net/man/ 查看和调整容器的优先级lxc-priority -n namelxc-priority -n name -p priority持续观察容器的
阅读全文
摘要:问题解决方法1. hadoop namenode -format2. 修改core-site.xml中的hadoop.tmp.dir 这个位置从/tmp到/var中的某个位置注意,这样操作数据可能丢失
阅读全文
摘要:debug模式:是否定义了NDEBUG宏,没有定义就是debug模式,可以使用如下打印调试信息:DLOG(INFO) << "Found cookies"; (最好使用DLOG(WARNING))
阅读全文
摘要:SIGINT SIGKILL SIGTERM这三个信号都是用于终止程序,具体差别为: SIGINT 通过ctrl+c 发送,可以被捕获。此信号被当前进程树接收到,也就是说,不仅当前进程会收到信号,它的子进程也会收到。 SIGTRM kill命令不加参数就是发送这个信号,可以被捕获。而且其子进程不会收到。如果当前进程被kill了,那么它的子进程的父进程将会是init,也就是pid为1的进程。 SIGKILL 是kill -9 发送的,该命令不能被捕获,程序收到这个信号后,一定会退出。
阅读全文
摘要:首先你要下载个chrome浏览器。火狐测试无效。。先来看看效果图。进到下单的界面,在席位下面选框选择硬卧或者软卧。在上面右击审查元素。。。。。找到<select name="passenger_1_seat_detail_select" style="display: none" id="passenger_1_seat_detail_select" onchange="setSeatDetail('1')"> <option value="0">随机&l
阅读全文
摘要:转载自:http://www.cppblog.com/lxyfirst/archive/2008/10/29/65447.htmllua作为小巧精悍的脚本语言,易于嵌入c/c++中 , 广泛应用于游戏AI ,实际上在任何经常变化的逻辑上都可以使用lua实现,配合c/c++实现的底层接口服务,能够大大降低系统的维护成本。下面对lua和c/c++的交互调用做一个实例分析:lua提供了API用于在c/c++中构造lua的运行环境,相关接口如下://创建lua运行上下文lua_State* luaL_newstate(void) ;//加载lua脚本文件int luaL_loadfile(lua_St
阅读全文
摘要:转载自:http://blog.codingnow.com/2009/03/lua_c_wrapper.html把 C 里的对象封装到 lua 中,方便 lua 程序调用,是很常见的一项工作。里面最大的问题是生命期管理问题。通常有两种方案:第一:编写 C 库的时候,完全针对 lua 设计,所有对象都有 lua_newuserdata 分配内存。对象和对象之间的联系可以使用 userdata 的 环境表,把对象间的引用放在里面,使得 lua 的 gc 过程可以正常进行。第二:给 C 对象简单加一个壳。lua 的 userdata 中仅仅保存 C 对象指针。然后给 userdata 设置 gc 元
阅读全文
摘要:转载自: http://blog.codingnow.com/2013/01/binding_c_object_for_lua.html如何绑定 C/C++ 对象到 Lua 里?通常是创建一个 userdata ,存放 C/C++ 对象指针,然后给 userdata 添加元表,用 index 元方法映射 C/C++ 中的对象方法。也有另一个手段,直接用 lightuserdata 保存 C/C++ 对象指针放到 Lua 中,在 Lua 中创建一个 table 附加元表来来包装这个指针,效果是类似的。区别在于对象生命期的管理方式有所不同。就这个问题,几年前我写过一篇 blog 。绑定 C/C++
阅读全文
摘要:Lua的核心优势:1.脚本语言,不用重新编译,方便集成入大的系统。(灵活性,拥抱变化,考虑一个大系统仅仅改一个小部分,如果用C实现,那么整个工程需要重新编译)2.运行速度快。3.便于快速开发原型。(考虑ptyhon)4.跨平台5.与其他语言的集成Lua程序设计语言是一个简洁、轻量、可扩展的脚本语言,是葡萄牙语中“Luna”(月亮)的意思。Lua的目标是成为一个很容易嵌入其它语言中使用的语言。大多数程序员也认为它的确做到了这一点。很多应用程序使用Lua作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括大话西游II、仙境传说、魔兽世界、战锤40k、博德之门、轩辕剑外传汉之云、愤怒的
阅读全文
摘要:1)新建用户:sudo useradd -m newuser 可创建家目录,但是显示有问题,而且不能命令回顾。2)删除用户:sudo userdel -r uewuser. 彻底删除,在删除用户的同时一起把这个用户的宿主目录和邮件目录删除。3)新建用户:sudo adduser newuser OK
阅读全文
摘要:转载自:http://blog.csdn.net/viproc/article/details/7570866情景描述: 按照hadoop手册,搭建Single Node. 启动hadoop时 #./start-all.sh 报错: ####################################################### localhost: Unrecognized option: -jvm localhost: Could not create the Java virtual machine. ###################################.
阅读全文
摘要:Hadoop使用的是HDFS,能够实现的功能和我们使用的磁盘系统类似。并且支持通配符,如*。 1. 查看文件列表查看hdfs中/user/admin/hdfs目录下的文件。a. 进入HADOOP_HOME目录。b. 执行sh bin/hadoop fs -ls /user/admin/hdfs查看hdfs中/user/admin/hdfs目录下的所有文件(包括子目录下的文件)。a. 进入HADOOP_HOME目录。b. 执行sh bin/hadoop fs -lsr /user/admin/hdfs 2. 创建文件目录查看hdfs中/user/admin/hdfs目录下再新建一个叫做newDi
阅读全文
摘要:原文自:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redisCassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4jWhile SQL databases are insanely useful tools, their monopoly of ~15 years is coming to an end.And it was just time: I can't even count the things that were
阅读全文
摘要:安装:http://www.neo4j.org/install核心特点:1.完全满足ACID事务原则2.快
阅读全文
摘要:参见:http://www.codeproject.com/Articles/93369/How-I-explained-OOD-to-my-wife话题:为什么要进行面向对象设计?软件开发唯一的真理是“软件必然修改”。一个敏捷设计的软件能轻松应对变化,能被扩展和复用。而应用“面向对象设计”是做到敏捷设计的关键。如果代码符合以下几点,那么你就在“面向对象设计”:面向对象复用变化的代价极小无需改代码即可扩展现在有许多设计原则,但是最基本的,就是SOLID(缩写),这五项原则。S = 单一责任原则O = 开闭原则L = Liscov替换原则I = 接口隔离原则D = 依赖倒置原则话题:单一功能原则
阅读全文
摘要:转载自:http://www.oschina.net/translate/linux-kernel-coding-style这是一篇用来描述 linux 内核的首选编码样式的短文档。每个人都有自己的编码风格,我不会 将我的观点强加到任何人的身上,但这正是我所要保持的东西,就像其他许多事情一样。至少请考虑在这里所列出的观点。首先,我建议打印出GNU编码标准的副本,不要去阅读,而是将这个典范刻录下来。好,现在正式开始:第1章:缩进T一个Tab键有8个字符位因此一个缩进也是8个字符位. 有人试图将一个缩进定义场4个字符位甚至2个, 这无异于试图将Pi的值定义为3.说明: 缩进的意义在于定义语句块的开
阅读全文
摘要:主要参考: http://hadoop.apache.org/docs/r0.20.0/quickstart.html其中,JAVA_HOME设置的为/usr/lib/jvm/java-6-sun ,这个为本机java的路径,可以将java-6-openjdk改为这个,命令:update-java-alternatives -s java-6-sun单台操作这个模式是在一个java进程中运行hadoop,便于调试,具体操作为在根目录下:$ mkdir input $ cp conf/*.xml input $ bin/hadoop jarhad...
阅读全文
摘要:转载自 http://www.cnblogs.com/frankjobs/archive/2008/07/14/1242324.html创建补丁文件diff -Naur 旧的目录 新的目录 > patch文件或者diff -Naur 旧的文件 新的文件 > patch文件对于目录层数的一些限制在创建patch的时候文件夹的层数应当是一样的,比如--- old/modules/pcitableMon Sep 27 11:03:56 1999+++ new/modules/pcitableTue Dec 19 20:05:41 2000这样是可以的。而--- old/try1/othe
阅读全文
摘要:1.用haddop提供的C API to HDFS来实现文件写入到HDFS中。过程中主要是在配置环境花了点时间参考官网:http://hadoop.apache.org/common/docs/r0.20.203.0/libhdfs.html不用重新编译直接用$HADOOP_HOME/c++/Linux-Linux-amd64-64/lib即可,若要编译libhdfs,在hadoop顶层目录运行:ant compile-c++-libhdfs -Dislibhdfs=trueAPI主要可以去hadoop软件包解压目录中查看hdfs.h定义的一些已实现的函数一门语言的初学入门例子,一般都是“he
阅读全文
摘要:转载自:http://xiaoli110.blog.51cto.com/1724/1070201我们为什么需要资源控制?在实际的生产环境中,希望每台虚拟机对资源的消耗是可控的,避免过度的消耗资源,造成对其他虚拟机的影响。测试环境:Centos 6.3 update到 2012年11月 25日。操作步骤1.升级系统到最新yum update -y2.安装epel源rpm -Uvh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-7.noarch.rpm3.安装cgroup包yum install libcgroup libg
阅读全文
摘要:转载自:http://blog.sina.com.cn/s/blog_406d9bb00100ui5p.htmlStorm是一个分布式的、容错的实时计算系统,遵循Eclipse Public License 1.0,Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm之于实时处理,就好比Hadoop之于批处理。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。可以使用任意编程语言来做开发。主要商业应用及案例:TwitterStorm的优点1. 简单的编程模型。类似于MapReduce降低了并行批处理复杂性,Storm降低了进行
阅读全文
摘要:作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明转自网址: http://xumingming.sinaapp.com/466/twitter-storm-code-analysis-zookeeper-dirs/我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeeper上面写状态信息来分配任务,supervisor,task(两个实体)通过从zookeeper中读状态来领取任务,同时supervisor, task也会定义发送心跳信息到zookeeper, 使得nimbus可以监
阅读全文
摘要:转载自:http://www.infoq.com/cn/news/2011/09/twitter-storm-real-time-hadoopTwitter将Storm正式开源了,这是一个分布式的、容错的实时计算系统,它被托管在GitHub上,遵循 Eclipse Public License 1.0。Storm是由BackType开发的实时处理系统,BackType现在已在Twitter麾下。GitHub上基本是用Clojure写的。Storm为分布式实时计算提供了一组通用原语,可被用于“流处理”之中,实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方式。 Storm也可被用于“连
阅读全文
摘要:git config --global user.name "Zhang Zhang"git config --global user.email "zhang_zhang@live.com"git config --global credential.helper cachegit config --global credential.helper 'cache --timeout=3600'创建工作目录git initgit remote add origin https://github.com/iieplatform/***.gi
阅读全文
摘要:转载自:http://dongxicheng.org/apache-mesos/mesos-base-libarary/1.Protocol bufferprotocalBuffer是google开源的用于数据交换的库,常用于跨语言的数据访问,担任的角色一般为对象的序列化/反序列化。 另一个与之类似的开源软件是facebook开源的thrift,它们两个最大区别是thrift提供了自动生成RPC的功能而Protocal Buffer需要自己实现,但ProtocalBuffer的一个优势是其序列化/反序列化非常高效。2.Libprocesslibprocess是采用C/C++编写的高效消息传递编
阅读全文
摘要:https://github.com/mesos/mesos/wiki/Using-ZooKeepermesos好像主要用zookeeper做为master选举,然后保持唯一的master在线http://dongxicheng.org/apache-mesos/meso-architecture/master做得尽可能地轻量级,其上面所有的元数据可以通过各个slave重新注册而进行重构,master里面包含的全为软状态
阅读全文
摘要:转载自:http://blog.sina.com.cn/s/blog_4a1f59bf0100qotf.htmlHadoop的调度示意图如下所示:在Mesos资源管理平台上,启动Hadoop计算框架的时候,只是启动了它的JobTracker,而并没有启动TaskTracker,这主要考虑到资源伸缩性的管理。下面将介绍,当在这种框架下提交一个Hadoop作业时,调度系统如何工作的。在Mesos启动的时候,只启动了JobTracker,并没有启动TaskTracker,那么提交的作业如何执行呢?在Mesos分析3的介绍中,ResourceOffer ---》ReplyToOffer ---》Res
阅读全文
摘要:unlink的特殊地方: unlink一般用于服务进程,进程在unlink时不会立刻删除文件,而是在进程终止时删除文件,一些服务程序通过文件及对文件加锁来保持进程的唯一性,为了保证程序没有正常结束下次再启动时能正常启动,程序会在开始时新建一个文件然后调用unlink。原理就是,它减少了该文件的链接数,如果再没有程序打开它,那么它就会被系统删除。(程序结束之后会关闭打开它的文件句柄)。下面是一个简单的介绍:linux中每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数。当通过shell的touch命令或者在程序中open一个带有.
阅读全文
摘要:转载自:http://linux.chinaunix.net/techdoc/net/2007/03/27/953429.shtmlltrace的功能是能够跟踪进程的库函数调用,它是如何实现的呢?在ltrace源代码从chinaunix.net中下载下来,做了一个粗略的分析。ltrace其实也是基于ptrace。我们知道,ptrace能够主要是用来跟踪系统调用,那么它是如何跟踪库函数呢?首先ltrace打开elf文件,对其进行分析。在elf文件中,出于动态连接的需要,需要在elf文件中保存函数的符号,供连接器使用。具体格式,大家可以参考elf文件的格式。这样ltrace就能够获得该文件中,所有
阅读全文
摘要:转载自:http://5iwww.blog.51cto.com/856039/771031strace 是一个非常简单的工具,用来跟踪可执行程序的系统调用(system call)。最简单的使用是,它追踪可行程序运行时的整个生命周期,输出每一个系统调用的名字,参数和返回值。但是它还可以做更多的事情:它可以基于系统调用或者系统调用组来过滤它可以通过计算制定系统调用的次数,花费的时间以及成功和失败的次数来描述系统调用的使用它可以追踪发送给进程的信号(signal)它可以通过进程id(pid)号加入到任意正在运行的进程上如何使用找出一个程序启动时读取了哪个配置文件有的时候,你发发现,无论你如何修改配
阅读全文
摘要:strace(用来跟踪任何程序的系统调用)和 GDB 调试工具(用来在受控的环境中运行程序的功能齐全的调试工具)strace 专注于监控一个程序系统调用和它接受到的所有信号(与Unix系统上的truss是一样的),使用的是内核系统调用ptrace。另外,还有类似的ltrace(同样是基于ptrace的),它功能是能够跟踪进程的库函数调用。gdb比starce能做的事情更多,比如gdb可以获得堆栈跟踪信息,堆栈跟踪不仅会告诉你程序当前正在做什么,有底层的信息(如等待网络套接字),也有较高级别的信息(如正在执行什么类型的网络操作)。下面是使用过程中一些命令小结:strace调试工具strace工具
阅读全文
摘要:平衡二叉树的常用算法有红黑树、AVL、Treap、伸展树平衡二叉树(Balanced Binary Tree)又被称为AVL树(区别于AVL算法,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法 平衡二叉树的常用算法有红黑树、AVL、Treap、伸展树等。红黑树 红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedge
阅读全文
摘要:转载自:http://dongxicheng.org/structure/red-black-tree/1. 简介红黑树是一种自平衡二叉查找树。它的统计性能要好于平衡二叉树(AVL树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除等操作。本文介绍了红黑树的基本性质和基本操作。2. 红黑
阅读全文
摘要:转载自:http://www.cnblogs.com/xiao-cheng/archive/2011/10/04/2198972.html定义:一棵空二叉树是AVL树,如果T是非空二叉树,TL和TR分别是其左子树和右子树,则当且仅当TL和TR都为AVL树且|HL-HR|<=1时,T是AVL树。由定义知道一个AVL树的任何节点的左右子树的高度之差不超过1,这是AVL树最基本的特征。AVL树的高度:(固定节点数计算最大高度)记N_h为一棵高度为h的AVL树具有的最小节点数,则最坏情况是它的左右子树的高度不等,一个是N_(h-1)和N_(h-2),从而得到N_h=N_(h-1)+N_(h-2)
阅读全文
摘要:转载自:http://hi.baidu.com/tianhua_sun/item/401166c90f874a03ad092f011. struct epoll_event 结构体epoll_event 被用于注册所感兴趣的事件和回传所发生待处理的事件,定义如下: typedef union epoll_data { void *ptr; int fd; __uint32_t u32; __uint64_t u64; } epoll_data_t;//保存触发事件的某个文件描述符相关的数据 struct epoll_event { __uint32_t events; /* epoll eve
阅读全文
摘要:转自:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.htmlLevelDb日知录之一:LevelDb 101 说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat。这两位是Google公司重量级的工程师,为数甚少的Google Fellow之二。 Jeff Dean其人:http://research.google.com/people/jeff/index.html,Google大规模分布式平台Bigta..
阅读全文
摘要:1libevlibev所实现的功能就是一个强大的reactor,可能notify事件主要包括下面这些:ev_io // IO可读可写ev_stat // 文件属性变化ev_async // 激活线程ev_signal // 信号处理ev_timer // 定时器ev_periodic // 周期任务ev_child // 子进程状态变化ev_fork // 开辟进程ev_cleanup // event loop退出触发事件ev_idle // 每次event loop空闲触发事件ev_embed // TODO(zhangyan04):I have no idea.ev_prepare //
阅读全文
摘要:ubuntu下安装libev开发包:$ sudo apt-get install libev-dev下面是libev的man page自带的libev用法示例,保存到testlibev.c 1 // a single header file is required 2 #include <ev.h> 3 4 #include <stdio.h> // for puts 5 6 // every watcher type has its own typedef’d struct 7 // with the name ev_TYPE 8 ev_io stdin_watche
阅读全文
摘要:libevent是一个异步事件处理软件函式库,以BSD许可证发布。libevent提供了一组应用程序编程接口(API),让程式设计师可以设定某些事件发生时所执行的函式,也就是说,libevent可以用来取代网络服务器所使用的事件循环检查框架。由于可以省去对网络的处理,且拥有不错的效能,有些软件使用libevent作为网络底层的函式库,如:memcached、Tor。目前libevent支持以下的方式判断IO事件:poll(2)select(2)几乎所有的Unix平台都有提供的函式。/dev/pool以Solaris平台为主。kqueue(2)以BSD平台为主。epoll(2)以Linux平台为
阅读全文
摘要:原文作者Alucard,来源于白云黄鹤BBS,白云黄鹤BBS->校园公益->Job_Discuss版->《2012武汉IT求职指南》最后一个忠告很给力,放到前面供大家参考一个优秀的程序员,一定要去做产品的公司,不要去做项目的公司。前者能够让你充分的展现才华,公司希望你能设计出更好的软件,这样一个软件能卖得更多;后者会压抑和劳累,公司规定你必须按照客户的要求去做,因为一个软件只在一处使用。本人计算机小硕,2011年华科计算机毕业,通过各种实习校招关系等等,拿了很多offer,了解到了武汉大部分比较好的IT公司信息,在这里给大家分享下。以下待遇都是说的“软件研发”岗位,因为我主要
阅读全文
摘要:转自http://www.cnblogs.com/flying_bat/archive/2008/01/18/1044693.html在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。1. do...while(0)消除goto语句。通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先
阅读全文
摘要:转载自:http://zhoulifa.bokee.com/3700951.html作为一个Linux系统下的C程序员,你可能发现调试程序是个比较麻烦的工作,虽然已经有gdb,kgdb等专业的调试软件,但如果对这些软件运用不熟练是根本达不到调试程序找出bug的目的的。又或者你对gdb已经很熟了,但运行gdb开始调试后在哪里设置断点成了你头痛的问题?当然,你可以从程序开始就以单步运行step by step来调试程序,但这会耗去你很多时间。如果你能很好地跟踪并记录程序的运行情况,那么一切将变得简单。下面我以一个实例说明我是如何操作的:首先我有一个程序主体main,其代码如下://////////
阅读全文
摘要:转载自http://www.searchtb.com/2012/09/tls.html现在使用多线程开发越来越普遍, 为了提高性能,性能局部变量使用也非常普遍.如线程私有的成员变量,buffer等.本文首先介绍线程局部变量的2 种使用方法:1). 常规的使用方式: 相对复杂2). __thread 修饰符: 使用简单,但容易不正确使用最后介绍封装的线程局变量操作接口,来解决上述两种使用方法的不足.该方法主要参考了 ACL 库关于这块的实现.1 常规的使用方式123456789#include <pthread.h>int pthread_once(pthread_once_t *o
阅读全文
摘要:EAGAIN 表明在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,可以重新尝试此操作EINTR 指操作由于终端而未能成功,可以重新尝试
阅读全文
摘要:一、简介:伸展树,或者叫自适应查找树,是一种用于保存有序集合的简单高效的数据结构。伸展树实质上是一个二叉查找树。允许查找,插入,删除,删除最小,删除最大,分割,合并等许多操作,这些操作的时间复杂度为O(logN)。由于伸展树可以适应需求序列,因此他们的性能在实际应用中更优秀。伸展树支持所有的二叉树操作。伸展树不保证最坏情况下的时间复杂度为O(logN)。伸展树的时间复杂度边界是均摊的。尽管一个单独的操作可能很耗时,但对于一个任意的操作序列,时间复杂度可以保证为O(logN)。二、自调整和均摊分析: 平衡查找树的一些限制:1、平衡查找树每个节点都需要保存额外的信息。2、难于实现,因此插入和删除操
阅读全文
摘要:man: #include <stdarg.h> void va_start(va_list ap, last); type va_arg(va_list ap, type); void va_end(va_list ap); void va_copy(va_list dest, va_list src);1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...);void foo(parm_list,...);2:函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:#includevoid fun(int a, ...){
阅读全文
摘要:信号量函数由semget、semop、semctl三个函数组成。下面的表格列出了这三个函数的函数原型及具体说明。1. semget函数原型semget(得到一个信号量集标识符或创建一个信号量集对象)所需头文件#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>函数说明得到一个信号量集标识符或创建一个信号量集对象并返回信号量集标识符函数原型int semget(key_t key, int nsems, int semflg)函数传入值key0(IPC_PRIVATE):会建立新信号量集对
阅读全文
摘要:先看看 shmctl()原型:intshmctl ( int shmqid, int cmd, struct shmid_ds *buf );返回:成功为0,失败 为-1这个特殊的调用和semctl()调用几乎相同,因此,这里不进行详细的讨论。有效命令的值是:IPC_STAT:检索一个共享段的shmid_ds结构,把它存到buf参数的地址中。IPC_SET:对一个共享段来说,从buf参数中取值设置shmid_ds结构的ipc_perm域的值。IPC_RMID:把一个段标记为删除IPC_RMID命令实际上不从内核删除一个段,而是仅仅把这个段标记为删除,实际的删除发生在最后一个进程离开这个共享段时
阅读全文
摘要:共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成。下面的表格列出了这四个函数的函数原型及其具体说明。1. shmget函数原型shmget(得到一个共享内存标识符或创建一个共享内存对象)所需头文件#include <sys/ipc.h>#include <sys/shm.h>函数说明得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符函数原型int shmget(key_t key, size_t size, int shmflg)函数传入值key0(IPC_PRIVATE):会建立新共享内存对象大于0的32位整数:视参数shmf
阅读全文
摘要:显示当前文件名:[Ctrl]+G 一次:set ls=2 一直显示ctags符号跳转:[Ctrl] + ] 跳转第一个符号[Ctrl] + t 跳回上一个符号处g + ] 列出满足符号的多个跳转路径供用户选择
阅读全文
摘要:__attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__ 后面紧跟一对括号,里面是相应的__attribute__参数。__attribute__ 语法格式为:__attribute__ ((attribute-list)) 位置为:放于函数等声明尾部的 ; 之前。函数属性(Function Attribute)函数属性帮助开发者把一些特性添加到函数声明中,可以使编译器在错误检查方面的功能更强大。__attribute__机制也很容易同非GNU应用
阅读全文
摘要:GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。__attribute__语法格式为:__attribute__ ((attribute-list))其位置约束为:放于声明的尾部“;”之前。函数属性(Function Attribute)
阅读全文
摘要:内核使用了大量不同的宏来标记具有不同作用的函数和数据结构。如宏__init、__devinit等。这些宏在include/linux/init.h头文件中定义。编译器通过这些宏可以把代码优化放到合适的内存位置,以减少内存占用和提高内核效率。下面是一些常用的宏:l__init标记内核启动时使用的初始化代码,内核启动完成后不再需要。以此标记的代码位于.init.text内存区域。它的宏定义是这样的:#define __init __attribute__ ((__section__ (".text.init")))l__exit标记退出代码,如果驱动不是以模块存在的,则该用法无
阅读全文
摘要:函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。 malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。 void *calloc(size_t numElements,size_t sizeOfElement); 如果调用成功,函数malloc()和函数calloc()都将返回所分配的内存空间的首地址。 函数malloc()和函数calloc(...
阅读全文
摘要:今天在看sheepdog源代码的时候,发现它的log系统使用了liburcu这个库里面的函数,详细调研了一下。读取拷贝更新,意思就是说,在要进行update的时候,先保留旧数据,然后替换新数据;再等待旧数据无人使用后,删除旧数据。从它的思想可以看到它写入数据的开销比较大,因为要等待所有读取线程都不在使用旧数据为止。这种结构比较适合用在很多线程读,但只有少量写的地方。Linux核心提供了基于RCU的锁函数。但在用户态下,需要自己调用其他库,比如liburcu这个库。liburcu is a LGPLv2.1 userspace RCU (read-copy-update) library. Th
阅读全文
摘要:Linux下这2个IP地址转换函数,可以在将IP地址在“点分十进制”和“整数”之间转换而且,inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。算是比较新的函数了。inet_pton函数原型如下[将"点分十进制" -> "整数"]#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>int inet_pton(int af, const char *src, void *dst);//这个函数转换字符串到网络地
阅读全文
摘要:小编今天为大家介绍一个不用找adhoc来连接wifi的方法,虚拟路由器 是款可以将无线网卡虚拟成 WiFi 热点的工具,满足没有无线路由器时移动设备的需要。是的,出门可以不用带无线路由器了,支持 window7/ 2008 R2。 首先,我们要下载虚拟路由器V1.1.0下载地址 1、修复能识别宽带连接等所有连接; 2、增加了创建wifi的提示窗口; 3、修改界面,默认放置在右下角; 下载安装后,只需要设置选择要共享的网络 >热点名称 > 设置热点密码 > 启动虚拟路由器。 密码需要需8位以上,WPA2 加密,如果仅有一个无线网卡设备,是不需要选择共享网络的。很快,就可以在移动
阅读全文
摘要:在configure.ac中AC_CHECK_LIB(pthread, pthread_create) 前面一个为库的名字,后面一个是库中函数的名字AC_CHECK_HEADERS(stdlib.h string.h pthread.h) 检查是否有头文件修改了configure.ac之后要运行aclocal 和autoconf
阅读全文
摘要:作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了。 在本文中,将给大家介绍如何使用 autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure”,“make”,“make install”就可以把程序安装到Linux系统中去了。这将特别适合想做开放源代码软件的程序开发人员,又或如果你只是自己写些小的Toy程序,.
阅读全文