前言:
1、fork 创建一个子进程,有两个返回值。返回0为子进程,返回大于0为父进程。
2、exec 运行新的可执行文件,取代原调用进程的数据段、代码段和堆栈段。一般是运行fork后,在子进程中执行exec。
3、exit(0)和_exit(0):exit(0)会先清理I/O缓冲后再调用系统exit,而_exit(0)是直接调用系统exit
4、wait函数是用于使父进程(也就是调用wait的进程)阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。如果该进程没有子进程或者他的子进程已经结束,则wait就会立即返回。
5、守护进程使用在android的system下面,如netd,vold等。
====================================================================
7.1.1 Linux 进程相关基本概念
进程是一个程序的一次执行的过程。程序是静态的,进程是动态的,包括动态创建、调试和消亡的整个过程。
2、进程控制块
进程是Linux系统的基本调度单位,系统通过进程控制块描述并表示它的变化。
进程控制块包含了进程的描述信息、控制信息以及资源信息,它是进程的一个静态描述。
在Linux中,进程控制块中的每一项都是一个task_struct结构,它是在include/linux/sched.h中定义的。
3.进程的标识
进程号(PID, Process Idenity Number) 和 父进程号(PPID, parent process ID)
在Linux中获得当前进程的PID和PPID的系统调用函数为getpid和getppid,
用户和用户组标识、进程时间、资源利用情况等。
4.进程运行的状态 进程是程序的执行过程,根据它的生命期可以划分成3种状态
执行态/就绪态/等待态
7.1.2 Linux下的进程结构
Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。
数据段存放的是全局变量、常数以及动态数据分配的数据空间(如malloc函数取得的空间)等。
代码段存放的是程序代码数据。
堆栈段存放的是子程序的返回地址、子程序的参数以及程序的局部变量。
在Linux系统中,进程的执行模式划分为用户模式和内核模式。
如果用户程序执行过程中出现系统调用或者发生中断事件,就要运行操作系统程序,变成内核模式。
7.1.4 Linux下的进程管理
进程管理分为启动进程和调度进程。
1.启动进程
主要有两种途径:手工启动和调度启动。手工启动是由用户输入命令直接启动进程,而调度启动是指系统根据用户的设置自行启动进程。
(1)手工启动进程又可分为前台启动和后台启动。
前台启动是手工启动一个进程的最常用方式。一般地,当用户键入一个命令如"ls -l"时,就已经启动了一个进程,并且是一个前台进程。
后台启动往往是在该进程非常耗时,且用户也不急着需要结果的时候启动的。比如格式化文本文件的进程。
(2)调度启动
费时且占用资源的维护工作,并且在深夜无人职守的时候进行,用户可以事先进行调度安排,指定任务运行的时间或者场合。
使用调度启动进程有几个常用的命令,如at命令在指定时刻执行相关进程,cron命令可以自动周期性的执行相关进程。
2.调度进程
调度进程包括对进程的中断操作、改变优先级、查看进程状态等。
ps | top | nice | renice | kill | crontab | bg
======================================================================
7.2 Linux进程控制编程
进程创建
1. fork()
pid_t fork(void);
在Linux中创建一个新进程的惟一方法是使用fork函数。它执行一次却返回两个值。
(1) fork函数说明
fork函数用于从已存在进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。
这两个分别带回它们各自的返回值,其中父进程的返回值是子进程的进程号,而子进程则返回0。因此,可以通过返回值来判断该进程是父进程还是子进程。
#include<sys/types.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h> int main(void){ pid_t result; result = fork(); if(result == -1){ perror("fork"); exit(1); } else if(result == 0){ printf("The return value is 0,In child process!! My PID is %d\n",getpid()); } else { printf("The return value is %d, In father process !! My PID is %d\n", result, getpid()); } }