Linux学习-3进程与线程

本文详细介绍了Linux操作系统中的进程和线程概念,包括进程的生命周期、属性、内存空间布局,以及创建进程、线程的方法。重点讲解了进程控制块(PCB)、task_struct结构、进程状态、文件管理和内存管理。同时,探讨了进程如何终止,如exit与return的区别,以及如何通过wait和waitpid函数获取子进程状态。此外,文章还涵盖了在进程中运行可执行文件的exec系列函数,以及Linux线程的创建、终止和管理,如pthread_join函数。
摘要由CSDN通过智能技术生成

目录

1 进程在内核中的组织

1.1 进程在内核的组织形式:进程控制块(PCB)(初始化信息)

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 进程的启动

3.2 进程的终止

3.3 进程的生命周期

3.3.1 终止进程的函数

3.3.2 exit与return的区别

3.3.3 注册终止处理函数

4 进程环境

4.1 进程内存空间布局

4.1.1 命令行参数

4.1.2 C程序中main函数参数

4.1.3 环境变量表

4.1.4 设置环境变量(putenv、setenv、unsetenv)

5 创建进程

5.1 创建进程

5.2 创建子进程

5.2.1 创建子进程示例

5.2.2 fork函数工作流程

5.2.3 fork函数执行后父子进程的主要异同

5.2.4 父子进程共享文件

5.2.5 fork的用法

5.2.6 vfork函数

6 获知子程序运行状态改变

6.1 僵尸进程

6.2 wait函数

6.3 waitpid函数

7 在进程中运行可执行文件

7.1 exec系列函数

7.2 execl函数

7.3 execv函数

7.4 execle函数

7.5 其他exec函数

 

7.6 exec类函数之间的关系

8 Linux线程控制

8.1 线程的基本概念

8.2 线程与进程的对比

8.3 线程ID

8.4 线程的创建

8.5 线程的终止

8.6 取消线程

8.7 父线程等待子线程终止

8.7.1 pthread_join函数


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的区别

  • returnC语言关键字,exitPOSIX API函数
  • main函数中,执行return和调用exit函数会产生相同的效果
  • 在子函数中,执行return仅仅从子函数中返回,而调用exit函数将会退出当前进程 

3.3.3 注册终止处理函数

  1. 当进程终止时,程序可能需要进行一些自身的清理工作,如日志登记、资源释放等
  2. 通过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;
环境变量字符串形式为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值