Updates from July, 2011 Toggle Comment Threads | Keyboard Shortcuts

  • admin 7:30 pm on July 10, 2011 Permalink | Reply  

    用C++来编写PHP扩展 

    前面有文章介绍过如何编写一个简单的PHP扩展。简单说,也就下面几步:

    1. 去ext目录用ext_skel生成扩展框架
    2. 去php源文件目录./buildconf –force
    3. 编辑config.m4
    4. 修改extname.c
    5. ./configure && make && make install

    本文介绍下如何在扩展编写过程中,使用C++。

    读到这里,如果你还不知道GNU m4或phpize,建议参阅下相关资料。简而言之,GNU m4是一个用于生成文件的宏处理器。这里的phpize是调用了GNU m4来生成configure文件以及其他相关文件。Configure则是生成Makefile的一个bash脚本。

    PHP扩展默认使用C语言来完成编码。若想使用C++,需要对config.m4文件做出相应修改。

     


    PHP_REQUIRE_CXX()

     

    PHP_ADD_LIBRARY_WITH_PATH(tlib, $LIB_EXPORT_PATH, WANGGOU_SHARED_LIBADD)

    PHP_ADD_LIBRARY_WITH_PATH(library_sys, $LIB_EXPORT_PATH, WANGGOU_SHARED_LIBADD)

    PHP_ADD_LIBRARY_WITH_PATH(library_util, $LIB_EXPORT_PATH, WANGGOU_SHARED_LIBADD)

    PHP_ADD_LIBRARY_WITH_PATH(ip_pool, $LIB_EXPORT_PATH, WANGGOU_SHARED_LIBADD)

     

    PHP_SUBST(WANGGOU_SHARED_LIBADD)

    PHP_ADD_LIBRARY(stdc++, 1, WANGGOU_SHARED_LIBADD)

     

    PHP_ADD_INCLUDE($INC_EXPORT_PATH)

    PHP_ADD_INCLUDE($EXT_PROTOCOL_PATH)

    PHP_NEW_EXTENSION(wanggou, wanggou.cpp, $ext_shared)

     

    说明:

    上述宏的第一句,表明了该扩展需要使用CXX编译器。

    接下来四行,添加扩展中依赖的库,也就是 –Lpath/to/lib –lsomelib 段的内容。

    接下来添加C++标准库。

    下来两行是头文件包含的目录配置。

    最后一行表明源代码文件的名字是以.cpp结尾。需要自己重命名自动生成的wanggou.c

     

    接下来就是编码了,像平常一样include头文件,修改完文件,直接make来测试。

    祝你成功!

    –EOF—

     
  • admin 12:10 am on October 24, 2010 Permalink | Reply  

    Linux获取硬件标识 

    1. gethostid()

    首先,unistd.h中有提供一个获取主机标识的函数: gethostid(); 可以返回一个以32位整数表示的标识符,它是由机器的IP经过移位后得到的。

    long hostid = gethostid();

    正因为这个hostid是由IP地址转换得来的,我们可以用它来快速获得当前机器的主IP:

    如hostid为:AABBCCDD,则IP为 BB.AA.DD.CC,当然各个部分还得转换成二进制数。

    2. Get harddisk Product ID

    这步的关键是ioctl的使用。首先,以只读的方式打开硬盘设备,给ioctl的第一个参数传递fd, 第二个参数传递HDIO_GET_IDENTITY,第三个地址是out类型参数,给它一个struct hd_driveid的结构体指针即可。

    ioctl(fd, HDIO_GET_IDENTITY, &hid);

    3. Get MAC address

    MAC地址的获取也是通过ioctl。

    4. Get CPU ID

    这个就是汇编了。

    见附件。

    mac.c ip.c hostid.c cpuid.c disk.c

     
  • admin 10:39 am on September 27, 2010 Permalink | Reply  

    又见Bash炸弹 

    今天一位同事在编码时不小心,忘记给循环加break。导致开发机(虚拟机)负载过高而无响应。ping值忽高忽低,ssh连不上,mysql连接超时。
    这不禁让人想起大名鼎鼎的Bash炸弹:

    :(){ :|:& };:

    在Bash中,冒号(:)是可以做为函数名的,所以这个炸弹也就很容易理解了:
    1. 定义一个函数
    2. 函数体中,递归调用此函数,并把输出重定向到管道。
    3. Bash中,函数调用是会启动新进程的,而管道后端又启动一个进程。
    4. 管道启动的新进程又会继续递归启用管道、启动新进程。
    5. & 符号把任务置于后台运行,避免终端交互。
    6. 连锁反应会继续,直接到达内核资源限制。若无限制,则直接会把服务器拖死。

    Perl 版本炸弹

    perl -e “fork while fork” &

    Python版本炸弹

    import os
    while(1):
    os.fork()

    Windows XP 批处理

    :bomb
    start %0
    goto bomb

    C语言版本

    int main() { while(1) fork(); }

    如何防范?

    通过限制用户对资源的占用来防止。因为此类炸弹是用耗尽系统资源来达到攻击目的的。Linux的限制方法有:
    ulimit 命令 或者 /etc/security/limits.conf

     
c
compose new post
j
next post/next comment
k
previous post/previous comment
r
reply
e
edit
o
show/hide comments
t
go to top
l
go to login
h
show/hide help
shift + esc
cancel