守护进程
进程组
进程组和会话在进程之间形成了一种两级层次关系
- 进程组是一组相关进程的集合
- 会话是一组相关进程组的集合
进程组和会话是为了支持shell作业控制而定义的抽象概念,用户通过shell能够交互式地在前台或后台运行命令
进程组由一个或多个共享同一进程组标识符的进程组成,一个进程组拥有一个首进程,该进程是创建该组的进程,其进程ID为该进程组的ID,新进程会继承其父进程所属的进程组ID
进程组拥有一个声明周期,其开始时间为首进程创建组的时刻,结束时间为最后一个成员进程退出组的时刻。一个进程可能会因为终止而退出进程组,也可能会因为加入另一个进程组而退出当前组。进程组的首进程不一定是最后一个离开的
会话(session)
会话是一组进程组的集合,会话首进程是创建该会话的进程,其进程ID就是会话ID,新进程会继承父进程的会话ID
一个会话中的所有进程共享单个控制终端,控制终端会在会话首进程第一次打开一个终端设备时被创建,一个终端最多可以作为一个会话的控制终端
在任一时刻,会话中的其中一个进程组会成为终端的前台进程组,其他进程组会称为后台进程组。只有前台进程组中的进程才能从控制终端读取数据。当用户在终端输入终端字符生成信号后,该信号会被发送到前台进程组的所有成员
当控制终端的连接建立起来后,会话首进程会成为该终端的控制进程
pid_t getpgrp(void); // 获取当前进程的进程组id
pid_t getpgid(pid_t pid); // 获取指定进程的进程组id
int setpgid(pid_t pid, pid_t pgid); // 设置某个进程的进程组id
pid_t setsid(void); // 创建会话并设置会话id
pid_t getsid(pid_t pid); // 获取指定进程的会话id
守护进程
守护进程(Daemon Process),是后台服务进程,生存期较长,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般以d结尾
- 生命周期较长,守护进程会在系统启动的时候被创建直到系统被关闭
- 在后台运行并且不拥有控制终端,确保内核不会为守护进程自动生成任何控制信号以及终端相关的信号(SIGINT/SIGQUIT)
Linux的大多数服务器就是用守护进程实现的,如Internet服务器inetd,Web服务器httpd