APUE学习笔记四——信号

信号的处理


  1. 忽略此信号。有两种信号不能忽略,它们是SIGKILL和SIGSTOP,原因是:它们向内核和超级用户提供了使进程终止或停止的可靠方法。
  2. 捕捉信号。不能捕捉SIGKILL和SIGSTOP信号。
  3. 执行系统默认动作。

exec函数会将原先设置为要捕捉的信号都更改为默认动作,其他信号的状态则不变,因为信号捕捉函数的地址很可能在所执行的新程序文件中已毫无意义。

函数


  • signal()函数的限制:不改变信号的处理方式就不能确定信号的处理方式。
  • sigaction()函数可以检查或修改一个信号的处理方式,而无需改变它。
  • kill()函数将信号发送给进程或进程组。
  • raise()函数则允许进程向自身发送信号。
  • laarm()函数可以设置一个定时器,在将来的某个时刻该定时器会超时,并产生SIGALRM信号。
  • pause()函数使调用进程挂起直至捕捉到一个信号。

Read more...

2014-08-26 Linux系统编程

APUE学习笔记三——进程

main函数


当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编辑器设置的,而连接编辑器则由C编译器调用。启动例程从内核取得命令行参数和环境变量值,然后为按上述方式调用main函数做好安排。

进程终止


正常终止: 1. 从main返回; 1. 调用exit; 1. 调用_exit或_Exit; 1. 最后一个线程从其启动例程返回; 1. 从最后一个线程调用pthread_exit。 异常终止: 1. 调用abort; 1. 接到一个信号; 1. 最后一个线程对取消请求做出响应。

退出函数


  • _exit()、_Exit()立即进入内核,exit()则先执行一些清理处理,然后返回内核。
  • 终止处理程序,通过atexit()登记,exit()自动调用,调用顺序与登记顺序相反,同一函数如若登记多次,也会被调用多次。

exit


Read more...

2014-08-23 Linux系统编程

APUE学习笔记二——流

流和FILE对象


  • 所有I/O函数都是围绕文件描述符的。
  • 对于标准I/O库,它们的操作是围绕流进行的。当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件相关联。
  • __流的定向__决定了所读、写的字符是单字节还是多字节。当一个流最初被创建时,它并没有定向。如果在未定向的流上使用一个多字节I/O函数,则将该流的定向设置为宽定向的。如果在未定向的流上使用一个单字节I/O函数,则将该流的定向设为字节定向的,相关函数:freopen()、fwide()
  • 为了引用一个流,需将FILE指针作为参数传递给每个标准I/O函数。
  • 预定义文件指针:stdin、stdout、stderr

缓冲


标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。 3种类型的缓冲:

  1. 全缓冲:在填满I/O缓冲区后才进行实际I/O操作。
  2. 行缓冲:当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。
  3. 不带缓冲

相关函数:setbuf()、setvbuf()


Read more...

2014-08-21 Linux系统编程

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原型