• Linux 守护进程


    Linux 守护进程

    守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。

    守护进程常常在系统引导装入时启动,在系统关闭时终止。

    编写守护进程

    1. 创建子进程,父进程退出

    由于守护进程是脱离控制终端的,子进程退出,会造成子进程没有父进程,从而变成一个孤儿进程。就会自动由1 号进程(也就是init 进程)收养它,这样,原先的子进程就会变成init进程的子进程了。

    2. 在子进程中创建新会话

    由于在调用fork函数时,子进程全盘拷贝了父进程的进会话期、进程组、控制终端。用 setsid 函数可以使进程完全独立出来。

    会话组是一个或多个进程组的集合。通常,一个会话开始于用户登录,终止于用户退出。

    SYNOPSIS

    #include <unistd.h>
    	
    pid_t setsid(void);
    

    3. 改变当前目录为根目录

    使用fork创建的子进程继承了父进程的当前工作目录。

    4. 重设文件权限掩码

    设置文件权限掩码为umask(0)

    5. 关闭文件描述符

    用fork函数新建的子进程会从父进程那里继承一些已经打开了的
    文件,消耗系统资源。比如,文件描述符为0、1和2的3个文件再也不会用到。关闭方式:

    for(i=0;i<MAXFILE;i++)
    	close(i);
    

    实例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    #define MAXFILE 65535
    
    int main()
    {
    	pid_t pc;
    	int i, fd, len;
    	char *buf = "This is a Daemon
    ";
    
    	len = strlen(buf);
    	/* 1. */
    	pc = fork();
    	if(pc < 0){
    		printf("error fork
    ");
    		exit(1);
    	}else if(pc > 0){
    		exit(0);
    	}
    	/* 2 */
    	setsid();
    	/* 3 */
    	chdir("/");
    	/* 4 */
    	umask(0);
    	/* 5 */
    	for(i = 0; i < MAXFILE; i++){
    		close(i);
    	}
    
    	while(1){
    		if((fd = open("/tmp/daemon.log", O_CREAT|O_WRONLY|O_APPEND, 0600)) < 0){
    			perror("open");
    			exit(1);
    		}		
    		write(fd, buf, len+1);
    		close(fd);
    		sleep(10);
    	}
    }
    

    结果如下:

    每10秒打印一次。

    xxx@xxx-pc:~/Documents$ cat /tmp/daemon.log 
    This is a Daemon
    This is a Daemon
    This is a Daemon
    

    守护进程的日志

    使用syslog服务,将程序中的出错信息输入到“/var/log/messages”系统日志文件中。

    守护进程在启动时会读一个配置文件“/etc/syslog.conf”。该文件决定了不同种类的消息会发送向何处。

    SYNOPSIS
    #include <syslog.h>

       void openlog(const char *ident, int option, int facility);
       void syslog(int priority, const char *format, ...);
       void closelog(void);
    

    syslog函数会自动调用openlog,closelog在程序结束时自动调用。实际上简单地输出log,只用调用syslog函数就可以了。

  • 相关阅读:
    【C++clock()函数学习(计算自己代码运行时间)】
    YCOJ 1041113【最近的回文数】
    计蒜客【汉诺塔II】
    YCOJ【汉诺塔】
    【常用算法总结——递归】
    YCOJ【查找】
    【常用算法总结——分治】
    Redis哨兵机制
    Redis主从复制
    SpringBoot集成Redis
  • 原文地址:https://www.cnblogs.com/fuluwwa/p/6768688.html
Copyright © 2020-2023  润新知