您的位置:首页 > 运维架构 > Linux

Linux系统编程--进程控制 (二)

2016-07-28 10:42 411 查看

一、创建进程

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.进程收到某个信号,使程序终止
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 linux