存档在 2013年4月

位运算如何将一个数上调至8的倍数

2013年4月25日

涉及到内存边界或者其他和操作系统位数相关情况下,很多时候需要将某个数上调,这里以上调到8的倍数为例。
比如:
1–>8
5–>8
14->16
31->32
是8的倍数的特点,8的倍数的二进制后4位必须是1000
又知道,向上调整最长的步长为7,比如1—>8 9—->16
所以可以先对某个数a进行加7,使其大于等于8的倍数。
然后再将后3bit位清0即可。

enum {_ALIGN = 8}
static size_t ROUND_UP(size_t size)
{
         return ((size + _ALIGN - 1) & ~(_ALIGN - 1));
}

2013年6月15日前目录

2013年4月24日
Intel Vtune Amplifier XE2011-性能优化工具性能安装Intel VTune Amplifier XE 2011性能
Linux多线程中pthread_cond_wait,pthread_cond_signal位置多线程pthread_cond_signal是否需要占用互斥量mutex多线程
利用分支预测优化代码分支预测C#资源管理器C#
Linux下获取当前应用程序路径linux条件编译小结条件编译
开源项目记录开源C++ Socket library配置开源
使用C++ Socket library创建套接字并回显收到的数据开源使用DisplaySocket 作为TCP客户端开源
使用DisplaySocket 作为服务器端开源DisplayRawSocket and DisplayLineSocket开源
创建套接字并返回SocketHandler 状态开源pkg-config 工具总结pkg-config
scpsshSocketAddress类开源
使用iostream封装TCP Socket套接字rdbuf()相关rdbuf
rdbuf重定向的使用rdbufrdbuf()不能使用在stringstream和fstreamrdbuf
从 fstream 对象获取文件描述符fdstreamLinux 下查看主机IP和MAC (局域网内linux
linux下HTTP/FTP客户端开发库开源大端模式与小端模式、网络字节顺序与主机字节顺序内存
非阻塞socket编程处理EAGAIN错误网络HTTP协议详解[转载]http

wget用法速查手册

2013年4月24日

Wget支持 HTTP, HTTPS, FTP和HTTP代理。

特性:

1.非交互式,意味着wget可以在一直后台运行,用户甚至无需登录。

2.wget可以追踪HTML,XHTML,CSS中的链接,从而方便的创建站点的本地镜像。

3.支持通配符,支持时间戳

4.健壮的设计使其可以在缓慢或不稳定的网络中使用。

5.支持使用代理。

6.支持IPV6(需编译时加入支持)

7.内建特性提供微调机制让你下载到你想要的连接。

8.几乎所有这些特性都是可配置的,通过命令行参数或配置文件

9.wget是自由,每个人都可以在GPL框架下使用,修改和再发布

调用:wget [OPTION]… [URL]…

1.URL格式:

http://host[:port]/directory/file

ftp://host[:port]/directory/file

或者在URL中使用 用户名和密码:

ftp://user:password@host/path

http://user:password@host/path

(这种做法不安全,其它用户可以用ps命令看到用户名 密码!)

对于ftp,wget支持类型设置:type=a (ascii 模式,‘i’ 二进制模式)

ftp://host/directory/file;type=a

2.基本选项:

-V(–version): 打印版本

-h(–help): 打印帮助

-b(–backgroud): 启动后在后台运行,默认output重定向到wget-log,可以通过-o 指定。

-e(–execute): 运行命令,如同在.wgetrc中的命令一样,但在.wgetrc所有命令之后运行

3.日志和输入文件选项

-o LOGFILE(–output-file=LOGFILE): 记录所有消息至LOGFILE中

-a LOGFILE(–append-output=LOGFILE):添加日志至LOGFILE中

-d(–debug):打开调试模式(需编译时添加debug支持)

-q(–quiet):关闭输出

-v(–verbose):冗余输出(默认)

-nv(–no-verbose): 关闭冗余输出

-i FILE(–input-file=FILE):从本地或外部文件中读URLS,本地文件使用–force-html强制作为html文件处理,外部文件自动当作html

-F(–force-html): 当从文件输入时,将文件当作html处理

-B URL(–base=URL): 解析相对链接时,使用URL作为参考点(可与-i配合使用)

3下载选项:

–bind-address=ADDRESS: 绑定地址

-t NUMBER(–tries=NUMBER): 设置重试次数,0或inf为无限次,默认20次,”connection refused” or “not found”除外。

-O FILE(–output-document=FILE): 所有下载文件均写入FILE中。

-nc(–no-clobber):加入此选项则当下载同一文件时,wget拒绝下载新版

-c(–continue): 当前目录下有不完整的文件时,断点续传之。

–progress=TYPE:设置进度显示格式,有dot和bar两种。

-N(–timestamping): 打开时间戳功能。

-S(–server-response): 打印HTTP服务器发送的头信息或FTP服务器的响应。

–spider: 只检查文件是否存在,不下载(类似web spider)。

-T seconds(–timeout=seconds): 设置超时时间,相当于同时设置`–dns-timeout’, `–connect-timeout’, 和`–read-timeout’

–dns-timeout=SECONDS:设置dns解析超时时间

–connect-timeout=SECONDS:设置连接超时时间

–read-timeout=SECONDS:设置空闲超时时间

–limit-rate=AMOUNT:下载速度限制

-w SECONDS(–wait=SECONDS):设置下载时间间距

–waitretry=SECONDS:设置错误重试时间间隔

–random-wait:设置等待时间为0.5至1.5*WAIT seconds间的随机值

–no-proxy:不使用代理

-Q QUOTA(–quota=QUOTA):设置下载配额。

–no-dns-cache:不使用dns缓存,即每次连接重新要求解析

–restrict-file-names=MODES:设置本地保存文件名的格式。

-4(–inet4-only):只用ipv4

-6(–inet6-only):只用ipv6

–prefer-family=none/IPv4/IPv6:设置首选类型。

–retry-connrefused:设置当connection refused时重试

–user=USER –password=PASSWORD指定用户名,密码。(不安全!)

–ask-password:每个连接弹出密码输入框。

–no-iri:关闭internationalized URI(IRI)支持,用–iri打开(默认)

–local-encoding=ENCODING:设置本地编码,供wget由本地URLS参数转至UTF-8时使用

–remote-encoding=ENCODING:设置远程编码,供wget转换远端编码至UTF-8时使用。

4.目录选项

-nd(–no-directories):不创建分层目录(所有文件都下至当前目录)

-x(–force-directories):与-nd相反,强制创建下载目录

-nH(–no-host-directories):不创建以主机为前缀的目录。

–protocol-directories:使用协议名称组成本地目录名

–cut-dirs=NUMBER:减去NUMBER个目录作为目录名

-P PREFIX(–directory-prefix=PREFIX): 文件下载至PREFIX

5,HTTP选项

–default-page=NAME:使用NAME作为默认主页名

-E(–adjust-extension):本地存储文件时加.html后缀

–http-user=USER –http-password=PASSWORD:

–no-http-keep-alive:关闭keep alive功能

–no-cache:关闭服务器端的缓存功能

–no-cookies:不使用cookies

–load-cookies FILE:从FILE加载饼干

–save-cookies FILE:保存饼干至FILE

–keep-session-cookies:保存会话饼干,与上个选项一起用

–ignore-length:忽略HTTP头中的Content-Length内容

–header=HEADER-LINE:构造HTTP头

–max-redirect=NUMBER:指定最大重定向数目

–proxy-user=USER –proxy-password=PASSWORD

–referer=URL:在HTTP头中包含Referer: URL

–save-headers:保存HTTP服务器发送的报头

-U AGENT-STRING(–user-agent=AGENT-STRING):设置用户标示

–post-data=STRING –post-file=FILE:使用POST方法发送STRING或FILE中的内容(key1=value1&key2=value2格式)

–content-disposition:试验性的支持Content-Disposition头

–auth-no-challenge:让wget发送基本HTTP认证信息

6.HTTPS(SSL/TLS)选项

–secure-protocol=PROTOCOL:选择安全协议类型(auto,SSLv2,SSLv3,TLSv1)

–no-check-certificate:不检查证书

–certificate=FILE:指定客户端证书

–certificate-type=TYPE:指定客户端证书类型

–private-key=FILE:从FILE读取私钥

–private-key-type=TYPE:指定私钥类型

–ca-certificate=FILE:指定CA文件

–ca-directory=DIRECTORY:指定CA文件所在目录

–random-file=FILE:在没有/dev/random文件的系统上,使用FILE作为随机数的源

–egd-file=FILE:使用FILE作为EGD套接字

7.FTP选项

–ftp-user=USER –ftp-password=PASSWORD

–no-remove-listing:不移除临时文件.listing

–no-glob:关闭FTP多文件获取功能(使用通配符)

–no-passive-ftp:关闭被动FTP模式

–retr-symlinks:下载链接指向的文件,而不是链接文件本身

8.递归下载

-r(–recursive):打开递归下载功能

-l DEPTH(–level=DEPTH):设置下载目录深度

–delete-after:每个文件下载后即删除

-k(–convert-links):下载完毕后,转换链接为相对链接

-K(–backup-converted):当转换连接时,保留原始备份为.orig

-m(–mirror):镜像下载,相当于同时打开-r -N -l inf –no-remove-listing

-p(–page-requisites):下载单页面所需的所有元素

–strict-comments:打开严格HTML注释解析

9.递归下载时的接受/拒绝选项

-A ACCLIST(–accept ACCLIST):指定接受的文件(逗号隔开的后缀名,或句式)

-R REJLIST –reject REJLIST:拒绝文件名单

-D DOMAIN-LIST(–domains=DOMAIN-LIST):设置追随的域名(逗号隔开)

–exclude-domains DOMAIN-LIST:设置不追随的域名

–follow-ftp:在HTML文档中追踪FTP

–follow-tags=LIST:设置追踪的tag

–ignore-tags=LIST:设置忽略的tag

–ignore-case:匹配文件或目录时忽略大小写

-H(–span-hosts):递归下载时,允许垮主机

-L(–relative):只追踪相对链接

-I LIST(–include-directories=LIST):设置追踪目录(逗号隔开,可含通配符)

-X LIST(–exclude-directories=LIST): 排除的追踪目录

-np(–no-parent):不进入父母录

Qt整形转固定长度字符串(含占位符)

2013年4月23日
QString ToStr(int number, int size)
{
    return QString("%1").arg(number, size, 10, QChar('0'));
}
QString::number(iHour, 10).rightJustified(2,'0')

Linux上有哪些常用的数据库

2013年4月23日

在Linux最常见的数据库包括MySQL、Sybase、Oracle等。其中由于MySQL为免费的软件,因此市场占有率最高,但由于MySQL所支持的功能少,因此较少用来开发正式的商业软件。

就Linux/UNIX上商用的数据库而言,仍是Oracle及Sybase占了大多数。而对于一般个人或小型企业使用的数据库,还是MySQL的市场占有率最高。

git基本概念理解

2013年4月22日

在日常使用GIT过程中,经常会出错,比如无意间丢失了未提交的数据,回退版本时丢失了工作目录,等等。经过思考发现,所有这些错误都是因为对GIT中一些基本的概念模糊而导致,因为对一些基本概念不清晰,导致对GIT每一条命令将会产生的结果不符合预期。下面我就梳理以下我经常碰到的问题相关的基本概念.。

1. Working Directory(工作目录)
Git的工作目录是保存当前正在工作的文件所在的目录,和working tree是相同的意思。在这个目录中的文件可能会在切换branch时被GIT删除或者替换。这个目录是个临时目录,临时存储你从GIT库中取出的文件,这些文件一直会被保存,直到下次提交。

2. GIT Directory(GIT库目录)
项目的所有历史提交都被保存在了GIT库目录中,只要你不作回滚操作,它应该不会丢失。

3. GIT Index(Git索引)
Git index 可以看作是工作目录和Git库目录之间的暂存区,和staging area是相同的意思。可以使用Git index构建一组你准备一起提交的改变。Git Index和Git Staging area是同一个意思,都是指已经被add的但尚未commit的那些内容所在的区域。最简单的查看目前什么内容在index中的方法是使用git status命令。
• 命令中”Changes to be committed“中所列的内容是在Index中的内容,commit之后进入Git Directory。
• 命令中“Changed but not updated”中所列的内容是在Working Directory中的内容,add之后将进入Index。
• 命令中“Untracked files”中所列的内容是尚未被Git跟踪的内容,add之后进入Index。
哪些操作能够改变git index中的内容?
A). git add …会将working directory中的内容添加进入git index。
B). git reset HEAD …会将git index中path内容删除,重新放回working directory中。

4. git diff
git diff可以比较working tree同index之间,index和git directory之间,working tree和git directory之间,git directory中不同commit之间的差异,
• git diff […]:这个命令最常用,在每次add进入index前会运行这个命令,查看即将add进入index时所做的内容修改,即working directory和index的差异。
• git diff –cached […]:这个命令初学者不太常用,却非常有用,它表示查看已经add进入index但是尚未commit的内容同最后一次commit时的内容的差异。即index和git directory的差异。
• git diff –cached [] […]:这个命令初学者用的更少,也非常有用,它表示查看已经add进入index但是尚未commit的内容同指定的之间的差异,和上面一条很相似,差别仅仅,即index和git directory中指定版本的差异。
• git diff […]:这个命令用来查看工作目录和指定的commit之间的差别,如果要和Git directory中最新版比较差别,则=HEAD。如果要和某一个branch比较差别,=分支名字
• git diff […]:这个命令用来比较git directory中任意两个之间的差别,如果想比较任意一个和最新版的差别,把其中一个换成HEAD即可。

5. 如何merge不同的分支
在git中,在执行任何命令时你一定要清楚,你在哪?对谁执行这个命令?
比如在创建新的branch时,执行命令:git branch 1.0-beta,这个命令是说在当前branch上,以当前branch为基准,创建一个新的branch,名叫1.0-beta。
在比如,当merge不同的branch时:

引用

git checkout 1.0-beta
git merge master

首先切换到1.0-beta branch上,然后将主干(master)上的代码合并到当前1.0-beta分支上。
merge完后,可能会由冲突,按照git的提示,编辑标识为”CONFLICT (content)”的文件,解决冲突后再次将冲突的文件add,commit后,merge完毕。

6. git reset
• 在一般使用中,如果发现错误的将不想staging的文件add进入index之后,想回退取消,则可以使用命令:git reset HEAD …,同时git add完毕之后,git也会做相应的提示,比如:

引用

# Changes to be committed:
# (use “git reset HEAD …” to unstage)
#
# new file: Test.scala

• git reset [–hard|soft|mixed|merge|keep] [或HEAD]:将当前的分支重设(reset)到指定的或者HEAD(默认,如果不显示指定commit,默认是HEAD,即最新的一次提交),并且根据[mode]有可能更新index和working directory。mode的取值可以是hard、soft、mixed、merged、keep。下面来详细说明每种模式的意义和效果。
A). –hard:重设(reset) index和working directory,自从以来在working directory中的任何改变都被丢弃,并把HEAD指向
B). –soft:index和working directory中的内容不作任何改变,仅仅把HEAD指向。这个模式的效果是,执行完毕后,自从以来的所有改变都会显示在git status的”Changes to be committed”中。
C). –mixed:仅reset index,但是不reset working directory。这个模式是默认模式,即当不显示告知git reset模式时,会使用mixed模式。这个模式的效果是,working directory中文件的修改都会被保留,不会丢弃,但是也不会被标记成”Changes to be committed”,但是会打出什么还未被更新的报告。报告如下:

引用

Unstaged changes after reset:
M Test.Scala
M test.txt

D). –merge和–keep用的不多,在下面的例子中说明。

下面列出一些git reset的典型的应用场景:
A) 回滚add操纵

引用

$ edit (1)
$ git add frotz.c filfre.c
$ mailx (2)
$ git reset (3)
$ git pull git://info.example.com/ nitfol (4)

(1) 编辑文件frotz.c, filfre.c,做了些更改,并把更改添加到了index
(2) 查看邮件,发现某人要你pull,有一些改变需要你merge下来
(3) 然而,你已经把index搞乱了,因为index同HEAD commit不匹配了,但是你知道,即将pull的东西不会影响已经修改的frotz.c和filfre.c,因此你可以revert这两个文件的改变。revert后,那些改变应该依旧在working directory中,因此执行git reset。
(4) 然后,执行了pull之后,自动merge,frotz.c和filfre.c这些改变依然在working directory中。

B) 回滚最近一次commit

引用

$ git commit …
$ git reset –soft HEAD^ (1)
$ edit (2)
$ git commit -a -c ORIG_HEAD (3)

(1) 当提交了之后,你又发现代码没有提交完整,或者你想重新编辑一下提交的comment,执行git reset –soft HEAD^,让working tree还跟reset之前一样,不作任何改变。
HEAD^指向HEAD之前最近的一次commit。
(2) 对working tree下的文件做修改
(3) 然后使用reset之前那次commit的注释、作者、日期等信息重新提交。注意,当执行git reset命令时,git会把老的HEAD拷贝到文件.git/ORIG_HEAD中,在命令中可以使用ORIG_HEAD引用这个commit。commit 命令中 -a 参数的意思是告诉git,自动把所有修改的和删除的文件都放进stage area,未被git跟踪的新建的文件不受影响。commit命令中-c 或者 -C 意思是拿已经提交的commit对象中的信息(作者,提交者,注释,时间戳等)提交,那么这条commit命令的意思就非常清晰了,把所有更改的文件加入stage area,并使用上次的提交信息重新提交。

C) 回滚最近几次commit,并把这几次commit放到叫做topic的branch上去。

引用

$ git branch topic/wip (1)
$ git reset –hard HEAD~3 (2)
$ git checkout topic/wip (3)

(1) 你已经提交了一些commit,但是此时发现这些commit还不够成熟,不能进入master分支,但你希望在新的branch上润色这些commit改动。因此执行了git branch命令在当前的HEAD上建立了新的叫做 topic/wip的分支。
(2) 然后回滚master branch上的最近三次提交。HEAD~3指向当前HEAD-3个commit的commit,git reset –hard HEAD~3即删除最近的三个commit(删除HEAD, HEAD^, HEAD~2),将HEAD指向HEAD~3。

D) 永久删除最后几个commit

引用

$ git commit …
$ git reset –hard HEAD~3 (1)

(1) 最后三个commit(即HEAD, HEAD^和HEAD~2)提交有问题,你想永久删除这三个commit。

E) 回滚merge和pull操作

引用

$ git pull (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset –hard (2)
$ git pull . topic/branch (3)
Updating from 41223… to 13134…
Fast-forward
$ git reset –hard ORIG_HEAD (4)

(1) 从origin拉下来一些更新,但是产生了很多冲突,你暂时没有这么多时间去解决这些冲突,因此你决定稍候有空的时候再重新pull。
(2) 由于pull操作产生了冲突,因此所有pull下来的改变尚未提交,仍然再stage area中,这种情况下git reset –hard 与 git reset –hard HEAD意思相同,即都是清除index和working tree中被搞乱的东西。
(3) 将topic/branch合并到当前的branch,这次没有产生冲突,并且合并后的更改自动提交。
(4) 但是此时你又发现将topic/branch合并过来为时尚早,因此决定退滚merge,执行git reset –hard ORIG_HEAD回滚刚才的pull/merge操作。说明:前面讲过,执行git reset时,git会把reset之前的HEAD放入.git/ORIG_HEAD文件中,命令行中使用ORIG_HEAD引用这个commit。同样的,执行pull和merge操作时,git都会把执行操作前的HEAD放入ORIG_HEAD中,以防回滚操作。

F) 在被污染的working tree中回滚merge或者pull

引用

$ git pull (1)
Auto-merging nitfol
Merge made by recursive.
nitfol | 20 +++++—-

$ git reset –merge ORIG_HEAD (2)

(1) 即便你已经在本地更改了一些你的working tree,你也可安全的git pull,前提是你知道将要pull的内容不会覆盖你的working tree中的内容。
(2) git pull完后,你发现这次pull下来的修改不满意,想要回滚到pull之前的状态,从前面的介绍知道,我们可以执行git reset –hard ORIG_HEAD,但是这个命令有个副作用就是清空你的working tree,即丢弃你的本地未add的那些改变。为了避免丢弃working tree中的内容,可以使用git reset –merge ORIG_HEAD,注意其中的–hard 换成了 –merge,这样就可以避免在回滚时清除working tree。

G) 被中断的工作流程
在实际开发中经常出现这样的情形:你正在开发一个大的feature,此时来了一个紧急的bug需要修复,但是目前在working tree中的内容还没有成型,还不足以commit,但是你又必须切换的另外的branch去fix bug。请看下面的例子

引用

$ git checkout feature ;# you were working in “feature” branch and
$ work work work ;# got interrupted
$ git commit -a -m “snapshot WIP” (1)
$ git checkout master
$ fix fix fix
$ git commit ;# commit with real log
$ git checkout feature
$ git reset –soft HEAD^ ;# go back to WIP state (2)
$ git reset (3)

(1) 这次属于临时提交,因此随便添加一个临时注释即可。
(2) 这次reset删除了WIP commit,并且把working tree设置成提交WIP快照之前的状态。
(3) 此时,在index中依然遗留着“snapshot WIP”提交时所做的uncommit changes,git reset将会清理index成为尚未提交”snapshot WIP”时的状态便于接下来继续工作。

(H) Reset单独的一个文件
假设你已经添加了一个文件进入index,但是而后又不打算把这个文件提交,此时可以使用git reset把这个文件从index中去除。

引用

$ git reset — frotz.c (1)
$ git commit -m “Commit files in index” (2)
$ git add frotz.c (3)

(1) 把文件frotz.c从index中去除,
(2) 把index中的文件提交
(3) 再次把frotz.c加入index

(I) 保留working tree并丢弃一些之前的commit
假设你正在编辑一些文件,并且已经提交,接着继续工作,但是现在你发现当前在working tree中的内容应该属于另一个branch,与这之前的commit没有什么关系。此时,你可以开启一个新的branch,并且保留着working tree中的内容。

引用

$ git tag start
$ git checkout -b branch1
$ edit
$ git commit … (1)
$ edit
$ git checkout -b branch2 (2)
$ git reset –keep start (3)

(1) 这次是把在branch1中的改变提交了。
(2) 此时发现,之前的提交不属于这个branch,此时你新建了branch2,并切换到了branch2上。
(3) 此时你可以用reset –keep把在start之后的commit清除掉,但是保持working tree不变。

7. git revert
git revert用于回滚一些commit。对于一个或者多个已经存在的commit,去除由这些commit引入的改变,并且用一个新的commit来记录这个回滚操作。这个命令要求working tree必须是干净的。
git revert和git reset的功能很相似,但是有区别,具体如下。
git revert用于用一个commit来记录并回滚早前的commit,经常是一些错误的提交。如果你想干脆扔掉working tree中的东西,可以使用git reset –hard
比如
A) git revert HEAD~3:丢弃最近的三个commit,把状态恢复到最近的第四个commit,并且提交一个新的commit来记录这次改变。
B) git revert -n master~5..master~2:丢弃从最近的第五个commit(包含)到第二个(不包含),但是不自动生成commit,这个revert仅仅修改working tree和index。

8. git revert 和 git reset的区别
1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

9. 如何删除远程分支
删除远程分支就是将本地的空分支push到远程即可。

引用

#查看远程分支
$ git ls-remote idc
Password:
fa7dc3cd254c6fff683e20722284565b92d869ff HEAD
14a62709ecadd11a266d234d19955f4679fa95ab refs/heads/cpp-1.0
34b38625bce0aa4d4a4e266e20bba3e0ccd1b97e refs/heads/cpp-1.0.RC1
3f40a21f20f51aaa74e2a6954b64d82506cd4adf refs/heads/cpp-1.1
2f795085d57b6784a6358d97dbd0d1227891b01a refs/heads/distri

#删除远程叫做diftri的分支
$ git push idc :distri
Password:
To xxx@192.168.4.40:Project.git
– [deleted] distri

#确认远程分支被删除
$ git ls-remote idc
Password:
fa7dc3cd254c6fff683e20722284565b92d869ff HEAD
14a62709ecadd11a266d234d19955f4679fa95ab refs/heads/cpp-1.0
34b38625bce0aa4d4a4e266e20bba3e0ccd1b97e refs/heads/cpp-1.0.RC1
3f40a21f20f51aaa74e2a6954b64d82506cd4adf refs/heads/cpp-1.1

9. 如何删除本地分支
使用git branch命令就可以删除本地分支,比如

引用

git branch -d toBeDelBranch

10. 如何clone(克隆)远程仓库中的指定分支,而非默认的master分支
在git clone 命令中使用-b参数指定分支名字即可,比如将远端aiotrade.git上的levelIISZ-1.1分支克隆下来:

引用

git clone -b levelIISZ-1.1 username@192.168.4.40:aiotrade.git

参考文献:
1. http://book.git-scm.com/3_basic_branching_and_merging.html
2. git reset –help
3. git revert –help
4.http://guibin.iteye.com/blog/1014369

系统调用和库函数的区别

2013年4月21日

库函数是高层的,完全运行在用户空间, 为程序员提供调用真正的在幕后完成实际事务的系统调用的更方便的接口。系统调用在内核态运行并且由内核自己提供。标准C库函数printf()可以被看做是一个通用的输出语句,但它实际做的是将数据转化为符合格式的字符串并且调用系统调用 write()输出这些字符串。

是否想看一看printf()究竟使用了哪些系统调用? 这很容易,编译下面的代码。

#include

int main(void)
{ printf(“hello”); return 0; }

使用命令gcc -Wall -o hello hello.c编译。用命令 strace hello 跟踪该可执行文件。是否很惊讶? 每一行都和一个系统调用相对应。 strace是一个非常有用的程序,它可以告诉你程序使用了哪些系统调用和这些系统调用的参数,返回值。 这是一个极有价值的查看程序在干什么的工具。在输出的末尾,你应该看到这样类似的一行 write(1, “hello”, 5hello)。这就是我们要找的。藏在面具printf() 的真实面目。既然绝大多数人使用库函数来对文件I/O进行操作(像 fopen, fputs, fclose)。 你可以查看man说明的第二部分使用命令man 2 write 。man说明的第二部分专门介绍系统调用(像kill()和read())。 man说明的第三部分则专门介绍你可能更熟悉的库函数(像cosh()和random())。

你甚至可以编写代码去覆盖系统调用,正如我们不久要做的。骇客常这样做来为系统安装后门或木马。 但你可以用它来完成一些更有益的事,像让内核在每次某人删除文件时输出 “ Tee hee, that tickles!” 的信息

回答2:

1、系统调用能够直接访问Linux内核体gonde丰富服务,比如基于文件描述符的I/O操作(C库函数基于文件指针)。于是,可以把系统调用看作是内核的低级接口;而C库调用处于Linux的编程接口的较高层次。实际上,许多库函数都是系统调用来实现的,例如malloc就是由系统调用sbrk实现的。

2、系统调用存在于内核空间,而大多数库调用都是用户模式的例程。所以系统调用有可能破坏系统,而库调用风险小的多。

3、库的可移植性也是一个主要优点

内存&数据结构中堆与栈的区别

2013年4月21日

数据结构的栈和堆

首先在数据结构上要知道堆栈,但实际上堆栈是两种数据结构:堆和栈。
堆和栈都是一种数据项按序排列的数据结构。
栈就像装数据的桶或箱子
我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取    出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。

堆像一棵倒过来的树
而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。 » 阅读更多: 内存&数据结构中堆与栈的区别