守护进程(setsid、getpgrp、setpgid、getpgid)以及系统日志(openlog、syslog、closelog)

守护进程:精灵进程

守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

特点:

1.脱离控制终端

2.会话的leader

3.进程组的leader

=============================

系统日志:

[root]# cd /var/log/    系统日志

主日志文件:messages

syslogd服务----权限分离:每个用户将要提交的日志提交给syslogd服务,syslogd将日志写入系统日志

#include <syslog.h>
/********************************
 * 功能:   为进程与syslogd服务建立连接
 * 参数:   ident:给出的字段,
            option:特殊要求LOG_PID.....
            facility:消息来源:LOG_DAEMON.....
 ********************************/
void openlog(const char *ident, int option, int facility);

/********************************
 * 功能:   提交内容
 * 参数:   priority:级别:LOG_INFO.....
            format:提交的内容(变参)
 ********************************/
void syslog(int priority, const char *format, ...);

/********************************
 * 功能:   断开进程与syslogd服务的连接
 *******************************/
void closelog(void);

=============================

[root]# ps axj  查看父子进程
tty:?脱离控制终端
SID PID PGID 相同
PPID:1

=============================

setsid:

#include <unistd.h>
/************************
 *功能:创建一个新的对话并设置进程组ID:如果当前调用它的进程不是进程组leader的情况下
 *返回值:成功返回进程ID,失败返回-1并设置errno
 * *********************/
pid_t setsid(void);

=============================

getpgrp:

/***********************
 *功能:获取进程组ID
 *返回值:成功返回进程组ID,失败返回-1并设置errno
 * *********************/
int getpgrp(void);

=============================

/*****************************
 * 功能:设置进程组ID
 * 参数:pid进程ID
 *       pgid进程组ID
 ****************************/
int setpgid(pid_t pid, pid_t pgid);

/**************************
 * 功能:获取进程GID
 * 参数:进程ID
 * ***********************/
pid_t getpgid(pid_t pid);

=============================

eg:

/***********************
 *功能:创建守护进程
 *      添加系统日志
 * ********************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <syslog.h>
#include <errno.h>

//守护进程创建后不断向FNAME中写入数字
#define  FNAME "/tmp/out"

static int daemonize(void )
{
    pid_t pid ;
    int fd ;
    int i ;
    //1.创建进程
    pid = fork();
    if(pid < 0)
        return -1;
    //2.子进程
    if(pid == 0)
    {
        //脱离控制终端 读写形式打开一个设备
        fd = open("/dev/null",O_RDWR);
        if(fd < 0)
            return -1 ;
        //重定向:将fd重定向到0 ,1 ,2
        dup2(fd , 0 );
        dup2(fd , 1 );
        dup2(fd , 2 );
        if(fd > 2)
            close(fd);

        //守护进程产生
        setsid();
        //当前的工作路径为根目录,如果是挂载的文件卸载可能回busy
        chdir("/");
        //在程序中不会产生文件的情况下
        umask(0);
        return 0 ;
    }
    else//2.父进程
        exit(0);
}

int main()
{
    FILE *fp ;
    int i ;
    //0.建立系统日志
    openlog("mydeamon",LOG_PID,LOG_DAEMON);

    //1.创建守护进程
    if(daemonize())
    {
        syslog(LOG_ERR ,"deamonize() failed !");
        exit(1);
    }
    else
    {
        syslog(LOG_INFO,"deamonize() success !");
    }
    //===========守护进程工作==============
    //2.以写的方式打开文件
    fp = fopen(FNAME , "w");
    if(fp == NULL)
    {
        syslog(LOG_ERR,"fopen()%s",strerror(errno));
        exit(1);
    }
    syslog(LOG_INFO ,"%s was opened",FNAME);
    //3.不断写入i的值eg:1 2 3 4 ......
    for(i = 0 ;; i++)
    {
        fprintf(fp,"%d\n",i);
        //文件全缓冲模式,要加刷新
        syslog(LOG_DEBUG , "%d is printed ",i);
        fflush(fp);
        sleep(1);
    }  //执行不到
    fclose(fp);
    closelog();
    exit(0);
}

[root]# ./demon

[root]# ps axj 查看deamon进程状态

[root]# tail -f /tmp/out 动态查看文件内数值的变化

[root]# kill pid号   杀死进程

[root]# tail /var/log/messages 查看系统日志

时间: 2024-10-17 03:55:03

守护进程(setsid、getpgrp、setpgid、getpgid)以及系统日志(openlog、syslog、closelog)的相关文章

数组,父子进程,守护进程

2015.1.25星期日,阴天 二维数组a中共有m行n列个元素从a[0][0]到a[i][j]之间共有i*n+j个元素p代表第0行第0列的地址,所以元素a[i][j]的地址为 p + i*n+j a[i][j] == p[i*n+j] == *(p + i*n+j) 在Linux中获得当前进程的PID和PPID的系统调用函数为getpid()和getppid();获得当前PID和PPID后可以将其写入日志备份! #include <stdio.h>#include <unistd.h&g

Linux多任务编程之七:Linux守护进程及其基础实验(转)

来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------------------------------ 守护进程概述 守护进程,又叫daemon进程(不知怎的,我突然想起来吸血鬼日记中的达蒙了,很好看的美剧),是Linux中的后台服务进程. 他是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或者等待处理某些发生的事件.守护进程常常在系统

从进程组、会话、终端的概念深入理解守护进程

一.写在前面 「守护进程」是 Linux 的一种长期运行的后台服务进程,也有人称它为「精灵进程」.我们常见的 httpd.named.sshd 等服务都是以守护进程 Daemon 方式运行的,通常服务名称以字母d结尾,也就是 Daemon 第一个字母.与普通进程相比它大概有如下特点: 无需控制终端(不需要与用户交互) 在后台运行 生命周期比较长,一般是随系统启动和关闭 二.守护进程必要性 为什么要设置为守护进程,普通进程不可以吗? 当我们在命令行提示符后输入类似./helloworld程序时,在

守护进程设计

课程索引 什么是守护进程 守护进程, 也就是通常说的Daemon( 精灵) 进程,是Linux中的一种服务进程. 它的特点是:•不占用控制终端(后台 运行)•独立于控制终端•独立于控制终端•周期性运行例如: smb 设计要素 2. 1 后台运行 守护进程需要独立于任何一个控制终端.实现方法调用是通过创建子进程来充当守护进程,而父进程退出,这样子进程就可以在后台运行.(范例展示)pid=fork();if(pid>0)if(pid>0)exit(0); //父进程退出else (pid==0){

[linux]进程(六)——守护进程

15,守护进程 概念:守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程的特点:守护进程必须与其运行前的环境隔离开来.这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等.这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的.守护进程的编程要点:(1)后台运行 方法是父进程fork()出子进程后,父进程九退出 if(pid=fork())  exit(0);//是父进程,结

apue学习笔记(第十三章 守护进程)

本章将说明守护进程结构,以及如何编写守护进程程序. 守护进程,也就是通常说的Daemon进程,是Unix中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件. 编程规则 在编写守护进程程序时需遵循一些基本规则,以防止产生不必要的交互作用.下面将说明这些规则. 1.调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0) 2.调用fork,然后使父进程exit,保证了子进程不是进程组的组长进程,是下面进行setsid调用的先决条件 3

探究守护进程及其错误日志处理

守护进程也是通常所说的deamon进程,他是linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务,或者等待处理某些发生的事件 编写守护进程的步骤: 1.创建子进程,父进程退出. 这儿有一个问题,由于父进程先于子进程退出,会造成子进程没有父进程,从而变成一个孤儿进程,在linux中,每当系统发现一个孤儿进程,就会自动由1号进程(init进程)收养,这样原来的子进程就变成init进程的子进程了 其实现代码如下: pid=fork(); if(pid>0)

linux系统日志函数syslog,openlog,closelog函数

三个函数openlog, syslog, closelog是一套系统日志写入接口.另外那个vsyslog和syslog功能一样,只是参数格式不同.[喝小酒的网摘]http://blog.const.net.cn/a/17152.htm    原理:通常,syslog守护进程读取三种格式的记录消息.此守护进程在启动时读一个配置文件.一般来说,其文件名为/etc/syslog.conf(注释:if you want to redirect log to other place,you need to

创建守护进程步骤与setsid() -- linux deamon进程

原创:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务.Linux系统的大多数服务器就是通过守护进程实现的.常见的守护进程包括系统日志进程syslogd. web服务器httpd.邮件服务器sendmail和数据库服务器mys