1 进程的定义
进程:进程是一个程序的一次执行过程,它和程序是有本质区别的,程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念;而进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和消亡的整个过程。它是程序执行和资源管理的最小单位。
2 进程控制块
进程是Linux系统的基本调度单位,进程控制块包含进程的描述信息、控制信息以及资源信息,是进程的一个静态描述。在Linux中,进程控制块中的每一项都是一个task_struct结构,它是在include/linux/sched.h中定义的。
3 在Linux中最主要的进程标识有进程号PID和它的父进程号PPID。PID与PPID都是非负数。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int mian()
{
printf("The PID of this process is %d\n",getpid());
printf("The PPID of this process is %d\n",getppid());
}
4 Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。
数据段:存放的是全局变量、常量以及动态数据分配的数据空间
代码段:存放的是程序代码的数据
堆栈段:存放的是子程序的返回地址、子程序的参数以及程序的局部变量
5 Linux系统中,进程的执行模式划分为用户模式和内核模式。如果当前运行的是用户程序、应用程序或者内核之外的系统程序,那么对应进程就是在用户模式下进行的;如果在用户程序执行过程中出现系统调用或者发生中断事件,那么就运行操作系统程序,进程模式就变成内核模式。
用户进程既可以在用户模式下运行,也可以在内核模式下运行。
6 调度进程:包括对进程的中断操作、改变优先级、查看进程状态等,在Linux下可以使用相关的系统命令实现其操作
Ps:查看系统中的进程
Top:动态现实系统中的进程
Nice:按用户指定的优先级运行
Renice:改变正在运行进程的优先级
Kill:终止进程
crontab:用于安装、删除或者列出用于驱动cron后台进程的任务
Bg:将挂起的进程放到后台执行
7 在Linux中创建一个进程的唯一方法是使用fork()函数。执行一次却返回两个值。
fork函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原来进程称为父进程。这两个分别带回他们各自的返回值,其中父进程的返回值是子进程的进程号,而子进程则返回0.因此,可以通过返回值来判定该进程是子进程还是父进程。
8 perror()用来将上一个函数发生错误的原因输出到标准错误(stderr)。参数s所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。
9 exec函数族提供了一个在进程中启动另一个程序执行的方法,它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,远调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件可以是二进制文件也可以是Linux下任何可执行的脚本文件。
10 exec函数族成员函数:
int execl(const char *path,const char *arg,.....)
int execv(const char *path,char *const argv[])
int execle(const char *path,const char *arg,.....,char *const envp[])
int execve(const char *path,char *const argv[],char *const envp[])
int execlp(const char *file,const char *arg,.....)
int execvp(const char *file,char *const argv[])
在使用exec函数族时,一定要加上错误判断语句。因为exec很容易执行失败,其中最常见的原因有:
找不到文件或路径,此时errno被设置为ENOENT
数组argv和envp忘记用NULL结束,此时errno被设置为EFAULT
没有对应可执行文件的权限,此时errno被设置为EACCES
11 exit和_exit函数都是用来终止进程的。当程序执行到exit或_exit时,进程会无条件的停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。
_exit() 直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构。
12 wait waitpid
wait函数是用于使父进程阻塞,知道一个子进程结束或该进程接受导了一个指定的信号为止。如果该父进程没有子进程或者他的子进程已经结束,则wait就会立即返回。
13 守护进程:是Linux中的后台服务进程,它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。
编写守护进程:
1)创建子进程,父进程退出
2)在子进程中创建新会话
进程组:进程组是一个或多个进程的集合。进程组由进程组ID唯一标识。每个进程组都有一个组长进程,其组长进程的进程号就等于进程组ID。
会话组:会话组是一个或多个进程组的集合,通常,一个会话开始于用户登陆,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。
setsid函数用来创建一个新的会话,并担任该会话组的组长。调用setsid有下面的3个作用:
让进程摆脱原会话的控制
让进程摆脱原进程组的控制
让进程摆脱原控制终端的控制
3)改变当前目录为根目录
4)重设文件权限掩码