LINUX-UNIX系统编程手册读书笔记(二)

第六章:进程

每个进程所分配的内存会由很多部分组成,被称为“段(segment)”

  • 文本段:进程运行的语言指令,只读
  • 初始化数据段:显式初始化全局变量静态变量
  • 未初始化数据段:未显式初始化全局变量静态变量。程序启动前,本段内存会被初始化为0,也称为BSS(block started by symbol)段。运行时再为其分配空间。
  • 栈(stack)是一个动态增长和收缩的,由栈帧(stack frames)组成。存储了函数的局部变量,实参,返回值。
  • 堆(heap)是在运行时为变量动态进行内存分配的一块区域。始于未初始化数据段的末尾。

    第七章:内存分配

在堆上分配内存

堆的内存边界称为(program break)
在堆上分配size字节的内存,并返回指向新分配内存起始处的指针。
可以随意释放内存块,被释放后就会被维护于一张空闲内存的表中。

1
2
void *malloc(size_t size);
void free (void *ptr);

malloc是基于8字节或16字节的字节边界来分配内存的
free不会降低program break的位置,而是将它置于空闲内存的列表中。
free过一次的地址不能再被free。
malloc()分配内存的时候会额外分配几个字节来存放这块内存的大小,记于内存的起始处,返回给调用者的地址在这一记录字节之后。

分配内存的其它方法:

1
2
void *calloc(size_t numitems, size_t size);//会分配size大小的numitems个连续内存(数组)
void *realloc(void *ptr, size_t size);

calloc()和malloc的不同点是:calloc()会将分配的内存初始化为0而malloc()不会
使用calloc()或realloc()分配的内存应该使用free()来释放。

第二十章:信号:基本概念

发往进程的信号,通常源于内核。信号到达后,进程会进行如下操作之一:

  • 忽略信号
  • 终止进程
  • 产生核心转储文件
  • 停止进程
  • 恢复进程执行

改变信号的处置

1
void (*signal(int sig, void(*handler)(int)))

signal返回的是之前的信号处置,像handler一样指向一个带有一个整型参数且无返回值的函数,handler的整型参数就是该信号值。

发送信号

1
2
int kill(pid_t pid, int sig);
//return 0 on success, -1 on error

如果pid>0,那么会发送信号给pid指定的进程
如果pid=0,那么会发送信号给调用进程同组的每个进程,包括调用进程自身。
如果pid<0,那会向组id等于该pid绝对值的进程组内所有下属进程发信号。
如果pid=-1,调用进程有权将信号发往每个目标进程,除去init和调用进程自身。(广播进程)