目录
一,进程的概念
进程是具有独立功能的程序关于某个数据集合上的一次运行活动。
进程的三种状态:就绪,执行,阻塞。
前台进程:与用户进行交互,会占用终端。用来实现大量的功能和占用大部分的资源
后台进程:不会占用终端的进程,占用少量资源。
僵尸进程,是指进程已经执行完了,但是其系统资源没有完全释放的进程。
孤儿进程:父进程已经退出的子进程。由爷爷进程或者1号进程托管。
进程组:父进程和子进程默认为同一进程组。
pid_t getpgrp(void);//获取组ID
int setpgid(pid_t pid,pid_t pgid);//用来把pid这个进程的组id设为pgid.
会话:前台进程组和后台进程组的联系,是多个进程组的集合
实现后台运行
a.创建一个子进程,然后把父进程退出。则该子进程就变成了后台进程。
b. ./hello & 后台运行,依赖于终端
c. nohup ./hello & 后台运行,其不依赖于终端
二,进程的API
1.创建子进程(fork)
pid_t 该类型用来表示进程的进程号(PID,PPID),在头文件中已声明。在操作系统内部
会为每一个进程分配一个与别的进程不相同的ID号,用来标识该进程。
pid_t fork(void);
返回值:失败返回-1,此时只有一个进程返回。
成功(创建了新的子进程)。
>0: 表示父进程返回,且此时的返回值是子进程的进程号
=0: 表示的是子进程返回。
fork内部会调用 clone()新创建的子进程拷贝父进程的地址空间(子进程拷贝父进程里面绝大部分
的数据,包括系统数据等数据,除了进程号)。
fork调用成功会产生一个子进程,子进程的代码执行点和父进程一样(fork返回处)。
fork一次调用,有两次返回。 一次是父进程返回,一次是子进程返回。
fork成功后谁先执行是不确定的(由任务调度算法来确定,一般是由时间片轮转算法)。
vfork的功能跟fork类似,只不过会堵塞父进程,即子进程执行结束后,才运行父进程。
pid_t vfork(void);
2.得到自身进程号
getpid用来返回自身进程的进程号
getppid用来返回父进程的进程号
pid_t getpid(void);
pid_t getppid(void);
3.进程的退出
一个进程退出有三种情况
1) main 函数执行完了 ==> 正常死亡
2) 被杀 ==> 非正常死亡
3) exit/_exit ==> 自杀
void exit(int status); //清理后退出 void _exit(int status); //不清理直接退出
4. wait/waitpid
wait/waitpid 用来等待某个子进程的状态发生改变。
等待的状态改变有如下三种情况:
1)子进程退出
2)子进程被信号中止 ==> 阻塞状态
3)子进程被信号唤醒 ==> 恢复到就绪态
wait 用来等待某个子进程的状态发生改变。
如果调用wait时,所有的子进程都已经退出,那么wait会立马返回。其他情况,wait会阻塞
调用进程,直到有一个子进程状态发生改变。如果一个子进程退出时,其父进程没有调用wait,那么该子进程就会变成僵尸(Zombie)进程,
wait/waitpid除了等待子进程状态发生改变外,另外一个作用就是回收资源(主要是指PCB(进程控制块)),而CPU和内存会自动释放)。
pid_t wait(int *wstatus);
@wstatus: 指针。用来保存退出的子进程的退出状态。
我们可以用下面的这些宏来解析它的信息和含义:
WIFEXITED(wstatus)为真,表示该子进程是正常退出的。
WEXITSTATUS(wstatus)返回该子进程的返回值(退出码),8bits无符号整数
WIFSIGNALED(wstatus)为真,表示该子进程是被信号结束的
WTERMSIG(wstatus)返回结束该子进程的那个信号的信号值
WIFSTOPPED(wstatus)为真,表示该子进程是被信号中止(stop)的
WSTOPSIG(wstatus)返回中止该子进程的那个信号的信号值
WIFCONTINUED(wstatus)为真,表示该子进程被信号唤醒的
返回值:
成功(至少有一个子进程的状态发生改变),返回状态改变的那个进程的ID
失败返回-1,errno被设置
waitpid的功能与wait类似,只不过它可以指定等待哪个或哪些子进程
pid_t waitpid(pid_t pid, int *wstatus, int options);
@pid: 用来指定等待哪个子进程或哪些子进程
pid > 0: 表示等待指定的子进程
pid == -1: 表示等待任意子进程
pid < -1: 表示等待组ID等于pid的绝对值的任意子进程
@wstatus: 指针。用来保存退出的子进程的退出状态。
@options: 等待方式,一般为0。当设置为 WNOHANG表示不阻塞。
非阻塞方式,假如没有子进程的状态改变则立马返回
返回值:
成功返回状态改变的那个进程的ID。如果设置了 WNOHANG方式且有子进程的状态
没有发生时,则立马返回0。
失败返回-1,errno被设置。