Code For Colorful Life
《UNIX Systems Programming》学习笔记一
缓冲区溢出攻击
进程地址空间布局
一个程序镜像在内存中的简单布局:
初始化的静态变量在编译的时候将会为其分配相应的地址空间并初始化,所以编译后的程序较大,如下两个程序:
程序largearrayinit.c
:
#include <stdio.h>
int arr[50000] = {1, 2, 3, 4};
int main(int argc, char *argv[])
{
arr[0] = 5;
return 0;
}
程序largearray.c
:
#include <stdio.h>
int arr[50000];
int main(int argc, char *argv[])
{
arr[0] = 5;
return 0;
}
编译后的结果:
一些来自库函数的编程准则
- 使用返回值来传递信息,并且错误信息能够被调用程序简单地获取,例如使用
errno
; - 不要在函数调用内执行
exit
,取而代之的是返回一个错误的值(-1),并且允许调用程序灵活的处理错误; - 不要对
buffers
作出任何假设; - 当需要使用限制值时,使用系统定义的常量值
limits.h
; - 不要重复造不必要的轮子,尽量使用标准库函数;
- 不要试图修改输入参数,除非真的必要;
- 尽量不使用静态变量和动态内存分配,如果自动变量能工作得好的话;
- 分析所有调用
malloc
家族系统调用的地方,确保在适当的时候释放申请的内存; - 分析一切可能的来自信号的中断;
- 仔细思考整个程序是如何
terminates
。
线程安全函数
POSIX
定义了线程安全函数,以_r
结尾,例如strtok_r
。
Read more...
nginx配置注意的问题
$document_root
这个全局变量是由root配置的,当有一点需要注意的就是,这个root是以php-fpm的worker进程的chroot目录作为根目录的。
假如网站根目录:/var/www
;请求http://localhost/index.php
,php-fpm配置worker的chroot为:/var/www
,那么nginx.conf中的root就应该设置为/
。
JS原型
为了便于理解,JS的对象可以划分为函数对象和普通对象,每个对象都有一个__proto__
属性,用于保存各对象原型的神秘链接,每个函数对象都有一个prototype
属性,该属性存储的就是原型对象。
下面看一个函数对象的原型链构:
1
2
3
function Person () {
this.me="rokety";
}
Read more...
MySQL事务学习
在MySQL中,通过START TRANSACTION
或者BEGIN
来开始一个事务,以COMMIT
或者ROLLBACK
来结束一个事务。
MySQL默认的隔离级别为可重复读。
MySQL有一个变量autocommit
,默认值为 ON 。当该值为 ON 时,在每一个会话中,每一次SQL查询都会作为一个单独的事务执行。如果该值为 OFF,那么每一个会话就是一个事务,需要明确执行 commit 或者 rollback 。
Read more...
Yii是如何产生视图文件?
一般我们会在控制器中调用:$this->render('contact', array('model'=>$model));
。
在经过一系列预处理后,会调用CBaseController
的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public function renderInternal($_viewFile_,$_data_=null,$_return_=false)
{
// we use special variable names here to avoid conflict when extracting data
if(is_array($_data_))
extract($_data_,EXTR_PREFIX_SAME,'data');
else
$data=$_data_;
if($_return_)
{
ob_start();
ob_implicit_flush(false);
require($_viewFile_);
return ob_get_clean();
}
else
require($_viewFile_);
}
- 该方法先判断
render()
的第二个参数是否为数组,如果为数组,导出变量,否则直接赋值给$data
。 - 如果需要返回,那么会通过PHP Output Control功能将要输出的视图文件转换为字符串返回。
- 否则直接包含文件。
Read more...
TSRM 线程安全资源管理器
学习自:第三节 PHP中的线程安全 和 深入研究PHP及Zend Engine的线程安全模型 和 究竟什么是TSRMLS_CC?
综合以上三篇文章,再看一下 PHP 源码才明白 TSRM 是怎么回事,这里做个学习记录。
线程安全
当PHP运行于多线程服务器时,处理请求的生命周期如下图:
在没有 TSRM 的时候,将会存在非线程安全问题,线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
在PHP的进程中,存在许多全局变量,比如许多符号表。
Read more...
UML类图关系:继承、实现、依赖、关联、聚合、组合
学习自:UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别 和 《UML和模式应用》
继承
一个类继承另外一个类,或者一个接口继承了其他接口。
1
2
3
@startuml
ClassA <|-- ClassB
@enduml
Read more...