1.进程环境
a) 终止
i. 进程终止
1. 正常终止:return+exit、_exit系
a) 【exit与_exit的区别】:exit退出时按atexit注册的相反顺序调用注册过的函数,对打开的流调用fclose将缓冲区的数据写到文件上(刷新缓冲区)。_exit没有
b) 【exit与自然返回return的区别】:return返回上层的函数调用,exit直接结束进程
2. 异常终止:信号+abort+线程响应取消
ii. 线程终止
1. 正常终止:pthread_exit
2. 异常终止:信号+abort+线程响应取消
iii. 内核使程序执行的方法只有exec函数,进程资源终止的方法唯有exit系,非自愿终止由信号
b) 存储空间分布
i. 命令行参数与环境参数
ii. 函数栈:自高地址向低地址生长,各个函数的函数栈帧按调用顺序放置其中。【函数栈帧】中包括函数的自动变量与每次调用所需保存的信息
iii. 堆:自低地址向高地址生长,new、malloc的同喜都在这儿
iv. 静态全局区
v. 正文段(程序二进制代码存放区)
vi. Goto是函数内跳跃;setjump与longjump是向上面一样退栈帧
2.进程控制
a) Fork
i. 完全拷贝父进程,拷贝的时候拷贝的是文件描述符,所以父子进程共享文件【竞态条件】,访问的时候需要同步
b) 孤儿进程与僵死进程【ps查看进程信息,Z,僵死进程】
i. 【孤儿进程】:父进程先于子进程退出,子进程就成了孤儿进程,孤儿进程会被init进程收养,init进程负责子进程的资源的回收。
ii. 【僵死进程】:子进程先于父进程退出。退出时会发出sigchld信号,父进程没有忽略或捕捉该信号,在信号处理函数中没有对子进程进行wait(即没有发生收尸行为),子进程就会成为僵死进程,即不工作,也不释放占用的资源(给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取。父进程结束之后,僵死进程作为没有父进程的子进程成为孤儿进程,然后被init收养,最后释放)。
1. 忽略sigchld信号(piox不行)
2. 捕捉sigchld信号,在信号处理函数中,用wait(无法处理并发子进程僵死的问题)/waitpid
c) 实际用户、有效用户和保存设置用户
i. 进程id:进程的标识符
ii. 进程组id:本进程所在进程组的标识符
iii. 实际用户id:当前进程的执行者的标识符
iv. 有效用户id:进程对资源的权限,进程可以访问有效用户可以操作的资源权限
v. 保存设置用户id:有效用户id的副本
d) exec
i. 调用exec执行新程序,但并不创建新进程,所以进程ID不变,只是替换了当前进程的正文段、数据段、堆段和栈段
e) system
i. System(“系统命令”)