现在的位置: 首页 > 综合 > 正文

《apue》 8,9,10章 进程知识点记录

2019年05月18日 ⁄ 综合 ⁄ 共 2823字 ⁄ 字号 评论关闭

学着多加入自己的理解

文章主要是为了自己看过后为了便于记忆和理解,没有详细写,只是记录个大概。

下面的每一个知识点都可以展开很多。附上了一些博客参考。

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

抱歉!评论已关闭.