patch命令的用法

patch是个什么东西?有什么用呢?

从一个实际的例子说起吧,看一些linux上crond 的源码: http://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/vixie-cron-4.1-72.el5.src.rpm

打开该文件后,会发现里面有很多的patch文件,要想看到完整的cron的源文件,需要自己打这些patch,如果不了解patch命令还不太好办。

 

首先解压该文件,目录结构大概为:

/

1.patch

2.patch

vixie-cron-4.1.tar.gz     // 打patch之前的源文件

vixie-cron.spec

 

首先从vixie-cron.spec中grep出来要打的patch:

grep -i “^patch” vixie-cron.spec  |awk ‘{print $2}’ >~/phpor

然后解压vixie-cron-4.1.tar.gz

tar -zxf vixie-cron-4.1.tar.gz

cd vixie-cron-4.1

while read p; do patch -p1 <../$p; done <~/phpor

 

这样就ok了。

 

关于patch命令的参考资料:

http://blog.chinaunix.net/uid-9525959-id-2001542.html

 

patch练习:

1. 创建一个patch文件

diff -uN oldfile newfile>1.patch

2. 打patch

patch <1.patch

 

给目录打patch

1. diff -uNr olddir newdir>2.patch

2. 打patch

patch <2.patch

 

diff 参数说明:

-u : 使用统一的输出格式 (默认的格式打patch不太好使)

-N: 对于目录比较来讲,新文件也打进去

-r: 对于目录来讲,递归处理子目录

 

 

 

 

CentOS源码在哪里

题记

作为一个和linux打交道的技术人员,需要了解linux、kernel、gnu、centos、redhat、RHEL等名词。

缘起

想看一下centos上的cron的源代码,不知道哪里找去;cron是centos发行版中自带的软件,你们http://centos.org 上应该有的吧,去了才发现里面都是二进制的代码包,根本没有源代码;最后是在http://redhat.com上找见的,为什么呢?这就是上面提到的需要了解的东西。

概念

linux通常指:kernel+gnu; kernel指的是内核,而gnu是一系列的开源的工具集;kernel+gnu依然是一个概念,不是一个可以使用的操作系统,而centos、redhat等等就是一个打包好的操作系统,就是我们通常所说的“发行版”;“发行版”是已编译好的操作系统,提供二进制的发布,不提供源代码,所以在centos.org上是找不到源代码的

centos5的源代码地址: http://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/

搜索方式: 在google中搜索:

vixie-cron-4.1-72.el5.src.rpm site:ftp.redhat.com

 

了解了这些之后,查看操作系统的源代码就方便多了,就不用到处去搜了

 

centos 安装文件: http://mirrors.sohu.com/centos/5/isos/i386/

网页上检测QQ已登录的实现机制

主要js文件:

http://imgcache.qq.com/ptlogin/ver/10013/js/xui.js?v=10007

建议将该文件格式化后分析,可以通过fiddler 自动响应的功能使用格式化的文件,然后在函数: onQloginSelect 上设置断点,然后跟踪下去就行了。

 

关键技术:

1. 浏览器插件,IE下使用 ActiveObjectX ,其它浏览器使用embed

2. 登录请求通过对域名的限制来实现

 

QQ登录插件文件:

C:\Program Files\Tencent\QQ\Bin\TXSSO\bin\npSSOAxCtrlForPTLogin.dll

 

分析的结果和下面文件中描述的一致,所以不再细说。曾经分析过,只是没有记录,都给忘了,这里记录一下。

 

相关参考资料: 搜索关键字:“embed application nptxsso”

http://1.lanz.sinaapp.com/?p=152

http://www.dewen.org/q/1027

http://www.udpwork.com/item/7598.html

 

学到的一些知识:

——————————————– 摘自上面参考资料

原来,QQ 使用了历史很悠久的 NPAPI(Netscape Plugin Application Programming Interface)接口。NPAPI 几乎支持所有主流浏览器,包括 FireFox、Chrome、Opera(IE 从 5.5 后停止支持 NPAPI,转而使用 ActiveX)。

打开 chrome://plugins/ 我们可以发现自动登录的有关插件,而在路径 C:\Program Files (x86)\Common Files\Tencent\TXSSO 下就可以找到关于 SSO 的相关动态链接库。

Tencent_SSO_plugin

np 插件一般命名都会加np前缀 如 QQ 的这个 npSSOAxCtrlForPTLogin.dll,只要按照标准的写法,放在浏览器会加载的地方,用的时候写个标签就可以在 js 里面调用了。于是跨浏览器(无视 IE)的插件开发变得相当可行。运行在 NPAPI 插件中的代码拥有当前用户的所有权限,不在沙箱中运行,所以它的扩展程序在被 Chrome 网上应用店接受前要求人工审核。

————————————————–

注意“插件”与“扩展”的区别,这里说的是“插件”; 上面提到的“人工审核”机制是怎么做到不审核就无法使用的呢? 在浏览器上通过都需要该浏览器的厂商审核通过?

Linux中的文件锁

问题:

Linux 中的flock等待锁的时候在做什么呢?是在循环检查锁是否已释放吗?

解答:

1. 将等待锁的进程置为阻塞状态

2. 当锁被释放时,再把等待锁的进程唤醒,等待锁的进程都在文件的结构中已链表的形式排队呢

3. 当进程意外死亡时,内核会自动释放其获得的锁资源

 

参考资料:
Linux 2.6 中的文件锁:http://www.ibm.com/developerworks/cn/linux/l-cn-filelock/index.html

 

摘录:

表 3. file_lock 数据结构的字段

类型 字段 字段描述
struct file_lock* fl_next 与索引节点相关的锁列表中下一个元素
struct list_head fl_link 指向活跃列表或者被阻塞列表
struct list_head fl_block 指向锁等待列表
struct files_struct * fl_owner 锁拥有者的 files_struct
unsigned int fl_pid 进程拥有者的 pid
wait_queue_head_t fl_wait 被阻塞进程的等待队列
struct file * fl_file 指向文件对象
unsigned char fl_flags 锁标识
unsigned char fl_type 锁类型
loff_t fl_start 被锁区域的开始位移
loff_t fl_end 被锁区域的结束位移
struct fasync_struct * fl_fasync 用于租借暂停通知
unsigned long fl_break_time 租借的剩余时间
struct file_lock_operations * fl_ops 指向文件锁操作
struct lock_manager_operations * fl_mops 指向锁管理操作
union fl_u 文件系统特定信息

 

一个 file_lock 结构就是一把“锁”,结构中的 fl_file 就指向目标文件的 file 结构,而 fl_start 和 fl_end 则确定了该文件要加锁的一个区域。当进程发出系统调用来请求对某个文件加排他锁时,如果这个文件上已经加上了共享锁,那么排他锁请求不能被立即满足,这个进程必须先要被阻塞。这样,这个进程就被放进了等待队列,file_lock 结构中的 fl_wait 字段就指向这个等待队列。指向磁盘上相同文件的所有 file_lock 结构会被链接成一个单链表 file_lock_list,索引节点结构中的 i_flock 字段会指向该单链表结构的首元素,fl_next 用于指向该链表中的下一个元素;当前系统中所有被请求,但是未被允许的锁被串成一个链表:blocked_list。fl_link 字段指向这两个列表其中一个。对于被阻塞列表(blocked_list)上的每一个锁结构来说,fl_next 字段指向与该锁产生冲突的当前正在使用的锁。所有在等待同一个锁的那些锁会被链接起来,这就需要用到字段 fl_block,新来的等待者会被加入到等待列表的尾部。

关于swap与缺页

问题:

1. 出现swap换入就意味着缺页吗?

2. 如何查看一个进程的换入换出?

3. 如何演示swap的换入换出?

 

解答:

1. 需要查一下

参考资料:

http://hi.baidu.com/shichaojiang/item/6fd7aa7950dd8235714423c2

这个写的还不错,一定要看一下

2.  查看进程的换入换出

查看100次,间隔为1s

sar -x pid 1 100

查看子进程的换入换出

sar -X pid 1 100

3. 需要思考一下

 

长连接与keepalive

缘起:

有这么一些服务器软件(如: tokyotyrant、memcached),他们提供长连接的功能,简单说,server端基本不会主动关闭连接的;非长连接的时候也会存在这种问题,只是长连接时会表现的更明显一下。如果客户端抽风(或者一些恶意的目的),打开连接后,并不关闭而直接离开,这样,就会在server端残留大量的连接,最直接的表象就是: netstat -anpt 时很慢。

真实案例:

具体原因未明,来个命令:

sar -n SOCK :

我们发现在1:30 PM时,tcp连接数突然飙升到 40万, 没有做任何操作3:40 PM时,连接数就开始减少了。

 

原因:

连接2小时没有操作,探活机制发现对方已经消失,于是,关闭了连接; 看了一下tokyotyrant 和 memcached的源码,都做了KEEPALIVE 的设置:

只是都没有做平静时间的设置,于是就都参考系统的设置了。

 

教训:

1. 如果没有keepalive的机制,系统运行时间过长总会出现这样的问题的

 

学习:

关于keep-alive的一些参数设置,摘自: man tcp :

tcp_keepalive_intvl (integer; default: 75)
The number of seconds between TCP keep-alive probes.

如果探活时,对方没有反应则,间隔 tcp_keepalive_intvl 秒后重发探活数据包,避免因丢包产生的探活差错

tcp_keepalive_probes (integer; default: 9)
The maximum number of TCP keep-alive probes to send before giving up and killing the connection if no
response is obtained from the other end.

如果发送了 tcp_keepalive_probes 次探活数据包,对方都没有反应,则视为对方死掉,而不是探活1次失败就放弃

tcp_keepalive_time (integer; default: 7200)
The number of seconds a connection needs to be idle before TCP begins sending out keep-alive probes.
Keep-alives are only sent when the SO_KEEPALIVE socket option is enabled. The default value is 7200 sec-
onds (2 hours). An idle connection is terminated after approximately an additional 11 minutes (9 probes
an interval of 75 seconds apart) when keep-alive is enabled.

Note that underlying connection tracking mechanisms and application timeouts may be much shorter.

从连接平静开始,间隔 tcp_keepalive_time 秒开始探活,避免对方异常退出

编程实现:

使用setsockopt(…) 函数来实现:

参考资料: http://ez.analog.com/docs/DOC-1862