程序
(program) 是一个普通文件,是为了完成特定任务而准备好的 指令序列
与 数据
的集合,这些指令和数据以 可执行映像
的格式保存在磁盘中。
进程
(process) 是一个已经 开始执行
但 还没终止
的 程序实例
。
程序
是个 静态
的文件,进程
是一个 动态
的实体。
1、进程 ID(PID)
每个进程在创建
时,内核
都会为之分配一个进程ID
(Process ID
,简称PID
)用来标识当前的进程,进程ID
是一个类型为pid_t
的整数
,并保持同一时刻是唯一值
,它最大值为pid_max
值(默认为32768
,可修改)。当进程退出时,它的进程ID
可回收循环使用。
Linux 系统getpid()
函数可以获取当前进程
的进程ID
。
2、父进程 与 子进程
进程创建时,创建进程
的是 新进程的父进程
(Parent Process
),新进程
是创建进程的子进程
(Child Process
)。
在子进程
中可以使用getppid()
函数获取父进程
的PID
。
3、创建进程 fork()
fork()
函数从运行着
的进程
中分裂出一个子进程
,它通过拷贝父进程
的方式创建子进程
。子进程
与父进程
有相同的代码空间
、文件描述符
等资源。
进程
创建后,子进程
与父进程
开始并发执行
,执行顺序由内核调度算法
来决定。
daemon()
函数的原型
如下:
#include <unistd.h>
pid_t fork(void);
fork()
函数:
(1)成功
创建了进程,对父进程
返回子进程的PID
,对子进程
返回0
。(fork()
函数被调用一次,但返回两次)
(2)失败
则返回-1
。
4、终止进程(exit()
)
进程终止
可分为正常终止
和异常终止
两大类:
序号 | 终止方式 | 具体方法 |
---|---|---|
1 | 正常 终止 | (1)从main() 函数return 返回;(2)调用 类 exit() 函数。 |
2 | 异常 终止 | (1)调用abort() 函数;(2)接收到一个 SIGABRT信号 终止。 |
5、守护进程(Daemon)
守护进程
(Daemon
)是运行在后台的一种特殊进程
。它独立于控制终端
并且周期性地执行某种任务
或等待处理某些发生的事件
,它不需要用户输入就能运行并提供某种服务。
守护进程
的父进程
是init进程
,因为它真正的父进程
在fork
出该子进程后就先于该子进程exit
退出了,所以它是一个由init领养
的孤儿进程
。
Linux 系统的大多数服务器
就是通过守护进程
实现的,且通常以字母d结尾
来命名进程名
,比如sshd
、xinetd
、crond
等。
Linux 系统有多种创建守护进程
的方法,其中最常用的是使用daemon()
函数来创建守护进程
。daemon()
函数的原型
如下:
#include <unistd.h>
int daemon(int nochdir , int noclose);
序号 | 参数 | 描述 |
---|---|---|
1 | int nochdir | 如果传入0 ,则daemon 函数将调用进程的工作目录设置为根目录 ,否则保持原有的工作目录不变 |
2 | int noclose | 如果传入0 ,则daemon 函数会将标准输入 、标准输出 、标准错误 重定向到/dev/null 文件中,否则不改变这些文件描述符 |
该函数如果成功
则返回0
,否则返回-1
,并设置errno
。