学着多加入自己的理解
文章主要是为了自己看过后为了便于记忆和理解,没有详细写,只是记录个大概。
下面的每一个知识点都可以展开很多。附上了一些博客参考。
1.TCMalloc
TCMalloc (google-perftools) 是用于优化C++写的多线程应用,比glibc 2.3的malloc快。这个模块可以用来让MySQL在高并发下内存占用更加稳定。
http://blog.csdn.net/chosen0ne/article/details/9338591
2.alloca
是在栈空间上分配空间会自动释放,但是会加长栈帧的长度(栈区为每个运行的函数分配一块区域是栈帧),
某些系统可能不支持增加栈帧的长度。
apue P167
3.setjmp 和longjmp
功能类似goto的跳转函数,但是不是像goto一样在函数内跳转,而是在函数栈帧之间进行跳转。
#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
jmp_buf是一个结构体,来保存恢复栈状态的信息。且必须定义为全局变量,因为setjmp和longjmp都要访问
一般先调用setjmp,放在返回的位置,它将所需的信息记入jmpbuffer中并返回0,在想出错返回的函数中调用longjmp,
一个setjmp可以对应多个longjmp是根据longjmp的第二个参数来确定是哪个longjmp的
具体看http://blog.csdn.net/wykwdy007/article/details/6535322
和apue P172
使用过程:
在一个想要出错跳转回来的函数使用setjmp( );也就是设置跳转回来的地点
在想要跳转的地方设置longjmp,执行后跳转到setjmp位置。
要会判断setjmp( )的返回值。
有个问题是跳转回去有些变量可能会变有些可能不变。(自动变量,全局变量,寄存器变量,静态变量和易失变量)
注意:如果要编写一个使用非局部跳转的可移植程序,则必须使用volatile属性,但是一个系统移植到另外一个系统时,任何事情都有可能改变
4.函数fork
#include <unistd.h>
fork函数是创建一个子进程的函数,调用一次,有两个返回值。
父进程返回子进程的ID,子进程返回0,因为父进程可以有多个子进程,父进程通过返回ID来标识子进程
getpid getppid getuid geteuid getgit getegid 是一族进程ID的函数
子进程和父进程继续执行调用fork后的指令。子进程是父进程的副本。
因为子进程获得了父进程的堆,栈,数据等的副本(代码段是共享的)。
为了提升效率,现在一些实现并不是子进程获得了父进程的数据,而是采用写时拷贝技术。(既如果父进程和子进程中的任何一个试图修改这些区域,
则内核只为修改区域的那块内存制作一个副本)。
注意:linux3.20后提供了clone函数,fork的改进可以允许调用者控制哪些部分由子进程和父进程共享。
fork进程的执行顺序是不定的,但是可以通过信号来使之同步。
注意一下fork和IO函数之间的交互关系,因为可能fork时也fork缓冲区的内容,那么子进程和父进程可能输出两遍。
文件共享
父进程和子进程他们共享打开的一个文件表项和文件的偏移量。
父进程和子进程的区别 fork的两种用法 apue P186
vfork
创建一个进程,然后父进程等待,子进程运行,直到子进程调用exec或exit之后父进程才可被调度。
子进程使用父进程的空间运行而没有自己拷贝空间。
可移植程序不该使用vfork
5.函数wait apue P190
pid_t wait(int *statloc); statloc是获取子进程结束的状态。可通过4个宏来查看
wait父进程挂起阻塞,等待子进程终止
waitpid
pid_t waitpid(pid_t pid, int *statloc, int options);
并不等待在其调用后第一个终止的子进程,有若干个选项,可以控制等待的进程
waitpid比子进程多的3个功能1.等待特定的进程,指定pid。2.提供非阻塞版本。3.支持作业控制
此外还有
waitid, wait3, wait4支持更多的功能
6.exec函数簇
exec函数簇的作用是用磁盘上的一个新的程序来替换当前的进程。前后ID并未改变。
我们一般使用fork出一个子进程,然后执行exec。
这写除了execve是系统调用,其余的都是库函数有7个函数,前6个execlp,execvp, execl,execv, execle, execve. 虽然函数多,但是参数大同小异
带v(vector)和带l(list)互斥,v表示函数取argv[ ]矢量,l表示取一个参数表,e表示envp[ ]数组,
p表示函数是以filename文件名作为参数(其他4个用pathname作为参数),并用PATH环境变量寻找可执行文件。
当函数传递参数envp时,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。
第7个是fexecve, 是使用文件描述符代替文件名或路径作为参数。
这篇博客介绍的不错。
http://www.cnblogs.com/blankqdb/archive/2012/08/23/2652386.html
7.更改用户ID和更改组ID
unix系统中,特权和访问控制是基于用户ID和组ID的
比如有时我们为了安全需要降低或提升权限.
特权(如能改变当前日期的表示法以及访问控制)是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己的用户ID或组ID,使得新ID具有合适的特权或访问权限。当程序需要降低其特权或阻止对某些资源的访问时,也需要更换用户ID或组ID,从而使新ID不具有相应特权或访问这些资源的能力。
一般来说我们总是试图使用最小特权(least privilege)。
apue P204
8.解释器文件
解释器文件个人理解就是一个文件包含一些指令,但是它不是一个可执行文件(类似a.out),而是需要解释器来操作执行。
UNIX系统都支持解释器文件,这种文件是文本文件,其起始行的形式是:
#! pathname [ optional-argument ]
常见的解释器文件以下列行开始:
#! /bin/sh
pathname通常是绝对路径名,对它不进行什么特殊的处理。内核调用exec函数的进程实际执行的并不是该解释器文件,
而是该解释器文件的第一行中pathname所指定的文件。
一定要将解释器文件(文本文件,它以#!开头)和解释器(由该解释器文件第一行中的pathname指定区分开来)
awk是一种解释器,介绍http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html