• 2009-10-28

    如何为Linux生成和打上patch

    Views: 10907 | No Comments

    通过diff工具生成补丁, patch工具打上补丁.

    在使用diff之前, 你需要保留一份未修改过的源码, 然后在其它地方修改源码的一份拷贝. diff对比这两份源码生成patch. 修改过的源码必须保留原来的文件名, 例如, 如果你修改源码中的a.c文件, 那么, 修改后的文件还是名为a.c, 在修改之前你可以复制a.c为a.orig.c进行备份.

    diff命令必须在整个Linux源码的根目录的上一级目录中执行.

    1. 为单个文件生成补丁

    diff -up linux-2.6.28.8/net/sunrpc/svc.orig.c linux-2.6.28.8/net/sunrpc/svc.c

    这条命令会产生类似如下的输出, 你将它重定向到一个文件中, 这个文件就是patch.

    --- linux-2.6.28.8/net/sunrpc/svc.orig.c 2009-03-17 08:50:04.000000000 +0800
    +++ linux-2.6.28.8/net/sunrpc/svc.c 2009-03-30 19:18:41.859375000 +0800
    @@ -1050,11 +1050,11 @@ svc_process(struct svc_rqst *rqstp)

    参数详解:
    -u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息.
    -p 显示代码所在的c函数的信息.

    Continue reading »

    Posted by ideawu at 2009-10-28 19:01:37
  • 2009-08-21

    遭遇SIGPIPE

    Views: 27842 | 2 Comments

    我写了一个服务器程序, 在Windows下在cygwin环境编译后执行, 然后用C#写了多线程客户端进行压力测试. 程序一直运行正常. 但当在Linux下测试时, 总是莫名退出. 最后跟踪到是write调用导致退出. 用gdb执行程序, 退出时提示"Broken pipe".

    最后问题确定为, 对一个对端已经关闭的socket调用两次write, 第二次*可能*会生成SIGPIPE信号, 该信号默认结束进程.

    具体的分析可以结合TCP的"四次握手"关闭. TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据. 也就是说, 因为TCP协议的限制, 一个端点无法获知对端已经完全关闭.


    截图来自: UNPv1

    对一个已经收到FIN包的socket调用read方法, 如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭. 但第一次对其调用write方法时, 如果发送缓冲没问题, 会返回正确写入(发送). 但发送的报文会导致对端发送RST报文, 因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以, 第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.

    为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它, 给它设置SIG_IGN信号处理函数:

    signal(SIGPIPE, SIG_IGN);

    这样, 第二次调用write方法时, 会返回-1, 同时errno置为SIGPIPE. 程序便能知道对端已经关闭.

    PS: Linux下的SIGALRM似乎会每1秒钟往后偏移1毫秒, 但Windows下经过测试完全准时, 不差1毫秒.

    Posted by ideawu at 2009-08-21 00:36:57 Tags:
  • 2009-07-16

    Linux+Keepalived双机互备

    Views: 28062 | 3 Comments

    大规模Web应用有两个要解决的问题: 高可用性和负载均衡. Keepalived可以提供IP层的高可用性, 一旦某一台机器的网络出现问题, 另一台服务器会立即(几秒或者更少的时间)使用出故障的服务器的IP进行工作. 具体的工作原理会在我学习之后, 发布在后期的文章中.

    现在有两台虚拟机ServerA和ServerB. 两个对外提供Web服务器的虚IP(VIP)192.168.200.100和192.168.200.200, 虚IP用在keepalived的配置中, 网卡接口配置有内网IP.

    ServerA:
    eth0: 192.168.200.128
    VIP: 192.168.200.100
    
    ServerB:
    eth0: 192.168.200.129
    VIP: 192.168.200.200
    

    如果两台服务器都正常地提供网络服务, 那么, 发往192.168.200.100的服务请求会被ServerA处理, 发往192.168.200.200的服务请求会被ServerB处理. 假设只有ServerB出现故障, 那么, 所有的请求都由ServerA进行处理. 当只有ServerA出现故障时, 也是同理.

    安装Ubuntu Linux Server

    本文使用的Linux为Ubuntu 9.04 服务器版, 请到http://www.ubuntu.com.cn/getubuntu/download-server/下载. 需要安装gcc, make开发环境.

    Continue reading »

    Posted by ideawu at 2009-07-16 23:09:45
  • 2007-03-25

    编译C语言代码

    Views: 15303 | 2 Comments

    一般我们会在某个C语言源码文件(如a.c)中使用"include"指令包含其它的文件(如b.h或者b.c).

    这样设想:
    // file: a.c
    include "b.h"
    //可能有include "b.c"
    //main()

    // file: b.h
    // 函数声明等

    // file: b.c
    include "b.h"
    // 函数定义
    我们可以先把b.c编译为模块b.o
    gcc -c b.c

    然后编译a.c
    gcc a.c b.o

    或者我们在a.c文件中直接包含b.c那么就可以这样编译:
    gcc a.c

    Posted by ideawu at 2007-03-25 22:12:31
  • 2006-12-18

    用mplayer,toolame提取rmvb等视频文件中的音频为mp3

    Views: 15571 | 3 Comments
    mplayer source.rmvb -ao pcm:file=destination_sound.wav -vo null

    把source.rmvb中的音频保存为destination_sound.wav. 也能转换VCD的DAT文件, 当然还有avi, 几乎所有你能见到的视频格式.

    然后用toolame转换为mp3:

    toolame destination_sound.wav destination_sound.mp3

    如果你有很多文件, 把它们放到一个单独的文件夹下, 再用一条类似

    for file in `ls -1`; do echo $file; done

    的命令一次把它们全都搞定.

    我之所以写这篇文章, 是因为我竟然一时想不起来怎么提取视频文件中的音频的命令了, 只隐约记得"pcm:file", 于是到mplayer的html文档目录下运行

    grep 'pcm:file' *

    总算找到了. 在这里做个记录.

    Posted by ideawu at 2006-12-18 20:51:48
  • 2006-12-09

    一位自学Linux和C的朋友找到工作

    Views: 16274 | 1 Comment

    论坛上的一位朋友自学Linux + C 语言, 本科刚毕业就进入了一家美资企业. 工资并不高, 看起来他对工作条件进学满意. 我们都为他感到高兴. 必须提到的是, 他并非计算机专业的学生, 而且是自学的.

    这说明了, 没有找不到工作的大学生, 只有不学习或者学习了但是天生痴呆的大学生. 不过, 建议中国的计算机系的大学生可以在Linux上培养兴趣.

    每一个人都应该努力!

    相关链接: http://www.linuxsir.org/bbs/showthread.php?t=285018

    Posted by ideawu at 2006-12-09 15:41:45 Tags:
|<<<34567891011>>>| 7/14 Pages, 84 Results.