进程(process)
定义:进程为执行一个程序所分配的资源的总称,是一次程序执行的过程,创建、调度、消亡,每一个进程都有唯一的PID号。
程序和进程的概念:
程序是放在磁盘上的一个有序的指令集合,就是一个数据包
进程是:把程序映射到内存中去,并调动系统资源把它运行起来,包括CPU,PCB程序进程控制块,寄存器,堆、栈。。。,就是一个运行中的程序,和它所分配到的资源总称就是进程。
图:
进程中的内存结构:
linux 操作系统采用虚拟内存管理技术,每个进程都有独立的地址空间;大小为4G,用户地址空间为0~0xC0000000(3G),内核占据3—4G
用户空间分为以下区域
1、只读段(存放程序代码、只读数据)
2、数据段(全局变量和静态变量)
3、栈、由系统自动分配(存放函数的参数的值、局部变量的值,返回的地址等等);
4、堆、存放动态分配数据一般由程序员动态分配的释放,程序员不释放,程序结束后自动回收。
5、共享库的内存映射。Linux的动态连接器和其他共享库的映射区域
进程类型:
交互进程(在shell下启动、在前/后台运行)
批处理进程(与终端无关,把一系列任务,用脚本顺序执行)
守护进程(后台运行)
进程状态:
运行态(R)
等待态( )
t停止态(T)
死亡态(S)
进程查看:
ps :显示当前进程状态 -elf|greo 程序名:显示该程序的进程状态
ps aux:显示所有程序状态
top:查看进程的动态信息 top -p +PID查看该进程的动态信息
/proc 查看进程的详细信息
我们主要介绍以下内容
一、进程的创建(fork)
二、exec函数族
三、守护进程
一、进程的创建(frok)
fork函数是创建一个一样的子进程,由父进程创建。
man:(在windows下用的头文件为<windows.h>)
创建失败返回-1
创建成功,该函数有两个返回值
父进程的返回值为子进程的PID号
子进程的返回值为0
通过这个可以判断那个是父进程那个是子进程:
exit();
终止进程
man
括号随便写什么(int)可以用statas来接收,一般用0表示终止成功
这个程序的功能为fork5个进程为父进程,子进程,孙子进程,重孙进程,曾孙进程。(注意我fork的位置,一定要在子进程里面fork要不然循环会让所有的进程都fork到时候就养兔子了)
线程的回收:(wait)
man:
wait 包含俩个头文件
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *status)
pid_t waitpid(pid_t pdi,int *sattus,int options);//回收PID号的进程
o若不回收进程,
父进程先结束,子进程变成孤儿进程,被Init收养然后变成后台进程。
子进程先结束,父进程没有被及时回收,子进程变成僵尸进程
二、exec函数族
frok是创建一个和父进程几乎一样的一个进程
而exec可以实现父子进程执行不同的程序,
1.父进程创建子进程
2.子进程调用exec函数族替换原本程序
3。父进程不受影响
它有上面六种不同的形式
后面加P的需要自己找路径,不加P的它自己会从环境中找路径
代码演示
三、守护进程
步骤:
1.创建子进程,父进程退出
2.创建新的会话,子进程成为新的会话组长 setsia();
3.更改当前工作目录 chdir(" / ");
4.重设文件掩码umask(0)
5.关闭打开的文件描述符。