APUE学习笔记——文件目录

UNIX标准


  1. ISO C:提供C程序的可移植性,使其能适合于大量不同的操作系统,而不只是适合UNIX系统;
  2. POSIX:由IEEE制订的标准族,可移植操作系统接口,定义了操作系统必须提供的各种服务;
  3. Single UNIX Specification:定义了一些附加接口扩展了POSIX.1规范提供的功能。

程序中的限制


  1. 编译时限制:可在头文件中定义limits.h
  2. 运行时限制:要求进程调用一个函数获得限制值sysconf()、pathconf()、fpathcof()

基本系统数据类型


头文件<sys/types.h>定义了基本系统数据类型,绝大多数以_t结尾,都是使用typedef定义。

文件I/O


文件描述符:是一个非负整数,STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO

常见I/O函数:open()、openat()、create()、close()、lseek()、read()、write().

内核使用3种数据结构表示打开文件:

file


Read more...

2014-08-17 Linux系统编程

《UNIX Systems Programming》学习笔记一

缓冲区溢出攻击


缓冲区溢出攻击

进程地址空间布局


一个程序镜像在内存中的简单布局: program image

初始化的静态变量在编译的时候将会为其分配相应的地址空间并初始化,所以编译后的程序较大,如下两个程序:

程序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;
}

编译后的结果:

largearray

一些来自库函数的编程准则


  1. 使用返回值来传递信息,并且错误信息能够被调用程序简单地获取,例如使用errno
  2. 不要在函数调用内执行exit,取而代之的是返回一个错误的值(-1),并且允许调用程序灵活的处理错误;
  3. 不要对buffers作出任何假设;
  4. 当需要使用限制值时,使用系统定义的常量值limits.h
  5. 不要重复造不必要的轮子,尽量使用标准库函数;
  6. 不要试图修改输入参数,除非真的必要;
  7. 尽量不使用静态变量和动态内存分配,如果自动变量能工作得好的话;
  8. 分析所有调用malloc家族系统调用的地方,确保在适当的时候释放申请的内存;
  9. 分析一切可能的来自信号的中断;
  10. 仔细思考整个程序是如何terminates

线程安全函数


POSIX定义了线程安全函数,以_r结尾,例如strtok_r


Read more...

2014-05-23 Linux系统编程

nginx配置注意的问题

$document_root


这个全局变量是由root配置的,当有一点需要注意的就是,这个root是以php-fpm的worker进程的chroot目录作为根目录的。

假如网站根目录:/var/www;请求http://localhost/index.php,php-fpm配置worker的chroot为:/var/www,那么nginx.conf中的root就应该设置为/


2014-05-20 nginx配置

JS原型

为了便于理解,JS的对象可以划分为函数对象和普通对象,每个对象都有一个__proto__属性,用于保存各对象原型的神秘链接,每个函数对象都有一个prototype属性,该属性存储的就是原型对象。

下面看一个函数对象的原型链构:

1
2
3
function Person () {
    this.me="rokety";
}

Read more...

2014-05-02 JS原型

MySQL事务学习

在MySQL中,通过START TRANSACTION或者BEGIN来开始一个事务,以COMMIT或者ROLLBACK来结束一个事务。

MySQL默认的隔离级别为可重复读。

MySQL有一个变量autocommit,默认值为 ON 。当该值为 ON 时,在每一个会话中,每一次SQL查询都会作为一个单独的事务执行。如果该值为 OFF,那么每一个会话就是一个事务,需要明确执行 commit 或者 rollback 。


Read more...

2014-04-05 事务

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...

2014-04-01 PHP应用

TSRM 线程安全资源管理器

学习自:第三节 PHP中的线程安全深入研究PHP及Zend Engine的线程安全模型究竟什么是TSRMLS_CC?

综合以上三篇文章,再看一下 PHP 源码才明白 TSRM 是怎么回事,这里做个学习记录。

线程安全


当PHP运行于多线程服务器时,处理请求的生命周期如下图:

在没有 TSRM 的时候,将会存在非线程安全问题,线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

在PHP的进程中,存在许多全局变量,比如许多符号表。


Read more...

2014-03-30 PHP底层