一、创建进程
1.创建进程:
(1)操作系统创建:它们之间是平等的,一般不存在资源继承关系。
(2)父进程创建:它和父进程存在隶属关系,通常称为子进程。子进程又可创建进程,这样形成一个进程家族。子进程可以继承父进程几乎所有的资源。
子进程继承父进程的很多属性,主要包括:用户ID,组ID,当前工作目录,根目录,打开的文件,创建文件时使用的屏蔽字,信号屏蔽字,上下文环境,共享的存储段,资源限制等。
ps: 系统进程:在系统启动时,操作系统会创建一些进程,它们承担着管理和分配系统资源的任务。
2.fork函数
(1)创建进程的实现
#include<sys/types.h>
#include<unistd.h>
pid_t fork(void);
成功调用fork函数后,当前进程实际上已经分裂成两个进程,一个是原来的父进程,一个是刚创建的子进程。
当进程创建成功,fork函数有两个返回值,一个是父进程调用fork函数后的返回值,该返回值是刚创建的子进程的ID,另一个是子进程中fork函数的返回值,该返回值是0;如果进程创建失败,则只返回-1。
创建失败的原因:通常是父进程拥有的子进程的个数超过了规定的限制;或可供使用的内存不足。
ID为6084的父进程创建了ID为6085的子进程
ps: fork之后父进程先执行还是子进程先执行是不确定的,这取决于内核所使用的调度算法。
(2)孤儿进程
一个子进程的父进程先于子进程结束,子进程就成为一个孤儿进程,它由init进程收养,成为init进程的子进程。
(3)vfork函数
vfork与fork的区别:
a.使用fork创建一个子进程时,子进程完全复制父进程的资源。子进程完全独立于父进程,具有良好的并发性。使用vfork创建一个子进程时,并不是将父进程的地址空间完全复制到子进程,而是子进程共享父进程的地址空间。
b.fork 创建一个子进程的时,哪个进程先运行取决于系统的调度算法。而vfork创建一个子进程时,vfork保证子进程先运行,当它调用exec或exit之后,父进程才可能被调度运行。
3.创建守护进程
(1)守护进程(daemon):在后台运行的,没有控制终端与之相连的进程。它独立于控制终端,通常周期性的执行某种任务。
(2)守护进程的启动方式:
a.Linux系统启动时从启动脚本/etc/rc.d中启动
b.由作业规划进程crond启动
c.由用户终端(通常是shell)执行
(3)编写创建守护进程的要点
a.让进程在后台运行
b.调用setsid创建一个新对话期
c.禁止进程重新打开控制终端
d.关闭不再需要的文件描述符
e.将当前目录更改为根目录
f.将文件创建时使用的屏蔽字设置为0
g.处理SIGCHLD信号
二、进程退出
进程退出表示进程即将结束运行,在Linux系统中进程退出的方法分为正常退出和异常退出
1.正常退出
a.在main函数中执行return
b.调用exit函数
c.调用_exit函数
2.异常退出
a.调用about函数
b.进程收到某个信号,使程序终止