1.进程的相关概念
(1)经典定义:一个执行中的程序的实例。
(2)上下文:系统中的每个程序都是运行在某个进程中的上下文中的,上下文是由程序正确运行所需的状态组成的。
这个状态包括:放在存储器中的程序的代码和数据,它的栈、通用目的的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
(3)进程提供的关键抽象:A.一个独立的逻辑控制流
B.一个私有的地址空间
但是父进程和子进程是拥有独立但是相同的地址空间,相同的文件描述符拷贝。
注:(1)并发(concurrency)和并行(parallel excution)
并发:一个逻辑流的执行在时间上与另一个流重叠。更准确地说,流X和Y互相并发,当且仅当X在Y开始之后和Y结束之前开始。
并发与计算机核数或者计算机数无关。
并行:如果两个流并发地运行在不同的核心或者计算机上,它们就是并行的。
2.进程的创建fork
3.进程的运行execve
4.进程的休眠sleep/pause以及进程的停止(收到停止信号)
5.进程的终止exit
6.进程的回收waitpid
注:(1)进程终止有三种方法,①收到一个信号,该信号的默认行为是终止进程 ②从主程序返回 ③调用exit函数
子进程终止以后,进程的资源并没有被释放,必须要尤其父进程回收以后,该进程的资源才被释放。
当然如果父进程终止了,系统会回收僵死的进程。
(2)进程的三种状态:①运行②停止③终止
停止有很多种可能,有可能是停止固定时间,有可能是停止等待任意信号量,有可能是停止等待SIGCONT信号量。
而子进程终止并不意味着资源被立即释放。
2015/10/11补充:
1.关于fork()函数
函数声明如下:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void)
函数调用后,就会创建1个子进程,然后和父进程并发地执行。
在父进程中,fork()返回子进程的pid,而在子进程中,fork()返回0.
所以后面的语句可以使用判断fork的返回值来使两个进程进行不同的操作。
2.waitpid()函数
声明如下:
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options)
(1)参数pid
>0 时,表示等待的子进程的pid。
-1时,表示等待调用该函数的进程的所有子进程。
(2)参数status
是用来存储导致返回的子进程的信息的。
(3)options,下面参数的括号表示宏的实际值
默认值 (0),表示只要有某个子进程终止返回。
WNOHANG (1),表示立即返回。
WUNTRACED(2),表示只要有某个子进程停止或者终止返回。
WNOHANG | WNOHANG,表示上面两者的结合,若是立即有子进程停止或者终止,返回该子进程pid,否则返回0.