进程
进程介绍
linux中的进程包含PCB(进程控制块)、程序以及程序所操纵的数据结构集,可分为“代码段”、“数据段”、“堆栈段”
PCB中包含以下内容:
(1)进程id
(2)进程的状态,运行、挂起、停止、僵尸等
(3)进程切换时需要保存和恢复的一些CPU寄存器
(4)描述虚拟地址空间的信息
(5)描述控制终端的信息
(6)当前工作目录
(7)umask掩码
(8)文件描述符表,包含很多指向file结构体的指针
(9)和信号相关的信息
(10)用户id和组id
(11)控制终端、Session和进程组
(12)进程可以使用的资源上限
程序和进程的区别
程序是一个普通的文件,是机器代码指令和数据的集合,程序是静态的实体。
进程在操作系统中指向特定的任务,进程是出于活动状态的计算机程序。进程是程序的一次执行
进程状态
运行状态 R
可中断睡眠状态 S
不可中断睡眠状态 D
暂停状态 T
僵死状态 Z
退出状态 X
进程标识
头文件
#include <sys/types.h>
#include <unistd.h>
函数原型
pid_t getpid(void);//返回自己的进程ID
pid_t getppid(void);//返回自己的父进程ID
pid_t getuid(void);//返回进程的实际用户ID
pid_t geteuid(void);//返回进程的有效用户ID
pid_t getgid(void);//返回进程的实际组ID
pid_t getegid(void);//返回进程的有效组ID
进程创建
复制进程映像(fork)
fork函数用于从已存在的进程中创建一个新进程,这个进程就是子进程,原进程为父进程
头文件
#include <sys/types.h>
#include <unistd.h>
函数原型
pid_t fork(void);
返回值
0:子进程
大于0:父进程
-1:出错
exit和_exit
exit和_exit都是终止进程的,调用后会无条件的停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止进程的运行
exit():
头文件
#include <stdlib.h>
函数原型
void exit(int status);
_exit():
头文件
#include <unistd.h>
函数原型
void _exit(int status);
exit 和 _exit中的status是一个整型参数,可以利用这个参数传递进程结束时的状态,0表示正常退出,其他数值表示出现了错误,进程非正常退出。
实际编程过程中可用wait系统调用接收子进程的返回值,从而针对不同情况进程不同处理
exit 和 _exit区别
_exit的作用是 1.清除这个程序使用的内存空间,2.清除他在内核中的各种数据结构,3. 终止程序
exit的作用 1.检查文件的打开情况,把文件缓冲区中的内容写会文件 2. 清除这个程序使用的内存空间,3.清除他在内核中的各种数据结构,4. 终止程序
wait和waitpid
wait函数用于父进程阻塞,直到一个子进程结束或者该进程接到一个指定的信号为止。(如果这个父进程没有子进程或者子进程已经结束,则wait就会立即返回)
头文件
#include <sys/types.h>
#include <sys/wait.h>
函数原型
pid_t wait(int *status)
参数
参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。
如果我们对子进程如何死的不感兴趣,我们就可以设定这个参数为NULL:
pid = wait(NULL);
如果我们有必要知道子进程如何死可以使用下面的宏:
WIFEXITED 子进程正常退出,返回非零值
WEXITSTATUS 如果WIFEXITED非零,返回进程退出码
WIFSIGNALED 子进程因未捕获信号而终止,返回非零
WTERMSIG 如果WIFSIGNALED非零,返回信号代码
WIFSTOPPED 如果子进程终止,返回非零
WSTOPSIG 如果WIFSTOPPED非零,返回一个信号代码
返回值
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。
waitpid作用和wait一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如:提供一个非阻塞版本的wait功能,也能支持作业控制。实际上wait是waitpid的一个特例
头文件
#include <sys/types.h>
#include <sys/wait.h>
函数原型
pid_t waitpid(pid_t pid,int *status,int options);
参数
pid:
pid==-1 等待任意子进程。于是在这一功能方面waitpid和wait等效。
pid>0 等待进程ID为pid的这个子进程
pid==0 等待其组ID等于调用进程的组ID的任一子进程
pid<-1 等待其组ID等于pid的绝对值的任一进程
status:同wait
options:
WHNOHAND 若由pid指定的子进程不立即可用,则waitpid不阻塞,此时返回值为0
WUNTRACED 若实现某支持作业控制,则由pid制定的任一子进程状态已暂停,且其状态自暂停一来还未报告过,则返回其状态
0 同wait,阻塞父进程,等待子进程退出