守护进程

2019-05-07  本文已影响0人  食梦狸猫

守护进程是生存期较长的一种进程,常常在系统开始时启动,直到系统关闭时才终止。因为没有控制终端,所以是在后台运行的。

父进程ID为0的各进程通常是内核进程,它们作为系统启动过程的一部分而启动(init进程是例外,它是内核启动时的用户层进程)。内核进程是特殊的,存在于系统的整个生命周期中。init进程是进程1,是一个系统守护进程,负责启动各运行层次特定的系统服务。

守护进程的特征

大多数守护进程都是以超级用户特权运行的。没有一个守护进程有控制终端,其终端名为?,进程组ID为-1。所有用户层守护进程都是进程组的组长进程和首进程,而且是这些进程组和会话中的唯一进程。大多数守护进程的父进程是init进程。

编程规则

void create_daemon()
{
    pid_t pid;
    pid = fork();
    
    if(pid == -1)
    {
        syslog(LOG_ERR,"fork error\n");
        exit(1);
    }
    else if(pid)
    {
        exit(0);
    }
    
    if(setsid() == -1)
    {
        syslog(LOG_ERR,"setsid error\n");
        exit(1);
    }
    else if(pid)
    {
        exit(0);
    }
    
    chdir("/");
    close(0);
    close(1);
    close(2);
    umask(0);
    return;
}

出错记录

大多数用户进程(守护进程)调用syslog函数以产生日志消息。

void openlog();
void syslog();
void closelog();
int setlogmask();

如果不调用openlog,那么在第一次调用syslog时,会自动调用openlog

单实例守护进程

在任一时刻,只运行该守护进程的一个副本。文件锁和记录锁机制是实现的一种方法,用于保证一个守护进程只有一个副本在运行。如果每一个守护进程创建一个文件,并且在整个文件上加上一把写锁,那就只允许创建一把这样的写锁。

extern int lockfile(int);
....
if(lockfile(fd) < 0)
{
  if(errno == EACCES || errno == EAGAIN)
    {
          close(fd);
          return(1);
    }
    syslog(LOG_ERR,"can't lock %s",LOCKFILE);
    exit(1);
}

守护进程的惯例:

上一篇 下一篇

猜你喜欢

热点阅读