Category Archives: C/C++

用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—

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

又见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