守护进程


概念

守护进程(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 //杀死进程

文章作者: Axieyun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Axieyun !
评论
评论
  目录