目录
1.1 进程在内核的组织形式:进程控制块(PCB)(初始化信息)
1.1.1 Linux进程控制块:task_struct结构
4.1.4 设置环境变量(putenv、setenv、unsetenv)
1 进程在内核中的组织
CPU载入程序到内存--->CPU初始化程序--->CPU进程调度程序
1.1 进程在内核的组织形式:进程控制块(PCB)(初始化信息)
初始化:进程ID,用户ID,进程状态,调度信息,文件管理,虚拟内存管理,信号,时间和定时器...
1.1.1 Linux进程控制块:task_struct结构
1.1.2 task_struct:进程状态
1.1.3 task_struct:文件管理
1.1.4 task_struct:内存管理
1.1.5 进程在内核中的组织形式
2 进程属性
2.1 进程基本属性-进程ID
2.2 真实用户和有效用户的关系
2.3 有效用户和真实用户实例
2.4 普通用户能够修改自己的密码的原因
3 进程生命周期
3.1 进程的启动
◼C程序的启动函数是
main
,也是进程代码的入口点
- main ( int argc, char *argv[] );
◼
当内核启动
C
程序时,会在调用
main
函数前调用特殊的启动函数来获取main
函数地址和传递给
main函数的参数,并且将这些信息填写到进程控制块中
3.2 进程的终止
◼
正常终止
- 从main函数中返回
- 在任意代码中调用exit函数或_exit函数
- 最后一个线程从其启动例程中返回
- 最后一个线程调用pthread_exit函数
◼
异常终止
- 在任意代码中调用abort函数
- 接收到终止信号
3.3 进程的生命周期
3.3.1 终止进程的函数
◼头文件
stdlib.h
,函数定义:void exit( int status )
◼头文件
unistd.h
,函数定义:
void _exit (int status )
◼调用这两个函数均会正常地终止一个进程
◼调用
_exit 函数将会立即返回内核
◼调用
exit
函数:
- 执行预先注册的终止处理函数
- 执行文件I/O操作的善后工作,使得所有缓冲的输出数据被更新到相应的设备
- 返回内核
3.3.2 exit与return的区别
- return是C语言关键字,exit是POSIX API函数
- 在main函数中,执行return和调用exit函数会产生相同的效果
- 在子函数中,执行return仅仅从子函数中返回,而调用exit函数将会退出当前进程
3.3.3 注册终止处理函数
- 当进程终止时,程序可能需要进行一些自身的清理工作,如日志登记、资源释放等
- 通过atexit函数或on_exit函数允许进程注册若干终止处理函数,当进程终止时,这些终止处理函数将会被自动调用
◼头文件stdlib.h
- int atexit(void (*func)(void));
- int on_exit (void (*func)(int, void *), void *arg);
◼ANSI C
规定一个进程最多能注册
32个终止处理函数
◼当显示调用或者隐含调用
exit
函数终止进程(从
main
中返回、最后一个线程退出等)将会回调这些注册的终止处理函数(最先注册的函数最后被回调)
◼显示调用
_exit
函数终止进程时将不会回调这些注册的终止函数
示例代码:atexit
示例代码:on_exit
4 进程环境
4.1 进程内存空间布局
正文:CPU执行的代码部分,正文段通常是共享、只读的
初始化的数据:包含了程序中需明确赋初值的变量,如全局变量int maxcount=99
未初始化的数据:程序执行之前,将此段中的数据初始化为0,如全局变量long sum[1000]
栈/堆:用于动态分配内存
命令行参数和环境变量:主要用于支撑函数调用存放参数、局部变量等
4.1.1 命令行参数
◼
ls [
参数
] <
路径或文件名
>
- ls –l /home
◼
mkdir [
参数
] <
目录名
>
- mkdir -p /home/xiaokun/src
◼
cp [
参数
]
<
源文件路径
> <
目标文件路径
>
- cp –r /usr/local/src /root
4.1.2 C程序中main函数参数
4.1.3 环境变量表
◼每个进程都会有自己的环境变量表
◼通过全局的环境指针(environ)可以直接访问环境变量表(字符串数组)
- 头文件unistd.h
- extern char **environ;
◼
环境变量字符串形式为