概念
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
守护进程(daemon)是生存期长的一种进程,没有控制终端。
它们常常在系统引导装入时启动,仅在系统关闭时才终止。UNIX系统有很多守护进程,守护进程程序的名称通常以字母“d”结尾:例如,syslogd 就是指管理系统日志的守护进程。通过ps进程查看器 ps -efj 的输出实例,内核守护进程的名字出现在方括号中.
需要注意的是,用户层守护进程的父进程是 init进程(进程ID为1),从上面的输出PPID一列也可以看出,内核守护进程的父进程并非是 init进程。对于用户层守护进程, 因为它真正的父进程在 fork 出子进程后就先于子进程 exit 退出了,所以它是一个由 init 继承的孤儿进程。
进程组
- 每个进程除了有一个进程ID之外,还属于一个进程组
- 进程组是一个或多个进程的集合,同一进程组中的各进程接收来自同一终端的各种信号
- 每个进程组有一个组长进程。组长进程的进程组ID等于其进程ID
会话session
- 会话(session)是一个或多个进程组的集合,进程调用 setsid 函数(原型:
pid_t setsid(void)
)建立一个会话。
创建守护进程
函数
#include <sys/types.h>
#include <unistd.h>
pid_t setsid(void);
- 该函数调用成功返回创建的session的id(其实也是当前进程自己的id),出错返回-1。
- 调用该函数前,当前进程不允许是进程组的Leader,否则该函数返回-1.
代码
#include <stdio.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
pid_t pd;
while ((pd = fork()) == -1); //一直创建子进程知道成功
if (pd) exit(1); //结束父进程
while ((pd = setsid()) == -1); //创建新会话,返回会话id.
printf("new session id is %d\n", pd);
if (chdir("/") == -1) { //切换到根目录
perror("chdir");
exit(1);
}
close(0); //关闭标准输入
open("/dev/null", O_RDWR); //切换到黑洞,可读可写
//标准输出、标准错误输出切换到黑洞
dup2(0, 1);
dup2(0, 2);
//任务
while (1) sleep(1); //睡觉
return 0;
}
利用以下命令查看进程
ps ajx
kill -9 pid //杀死进程