守护进程的相关概念及用法

1>概念
                守护进程,也就是通常所说的Daemon进程,
                是linux中的后台服务进程
                它是一个生存期较长(长生)的进程,在系统引导装入时启动,在系统关闭时终止。
                不受终端控制
                并且周期性的执行某种任务或等待处理某些事件
                
                linux系统有很多守护进程,大多数服务都是用守护进程实现的。
                
            2>相关概念
                1>终端
                    在linux中,每一个系统和用户进行交流的界面叫终端或会话
                    
                2>控制终端
                    每一个从此终端开启的进程都会依附与这个终端,这个终端就被称为这些进程的
                    控制终端,当这个终端被关闭时,相应的进程也会自动关闭

守护进程可以突破这种限制,它被执行开始运行,直到整个系统被关闭才会退出
            如果想让某个进程不因为用户或终端或其他变化而受影响,就必须把这个进程变成一个守护进程。

            没有终端--->没有输入输出
           
            后台进程--->默默执行
            
      

  守护进程的创建:
                1>创建子进程2,结束父进程1    (为会话做准备)
                        --->进程组的组长不具备设置会话的能力
                        if(fork()!=0)
                                exit(0);
                            
                2>设置当前子进程为一个会话    (摆脱原终端的影响)
                        if(setsid()<0)
                        {
                            perror("setsid error");
                            exit(1);
                        }
                
                3>创建子进程3,结束父进程2
                        --->让子进程3不具备打开终端的能力
                        if(fork()!=0)
                                exit(0);
                4>关闭所有文件描述符
                        --->节省资源
                        int i;
                        for(i=0;i<sysconf(_SC_OPEN_MAX);i++)
                                close(i);
                
                5>改变执行目录
                        --->将执行目录换到 根目录 下
                        chdir("/");
                
                6>修改掩码
                        --->将掩码修改为0
                                默认为0002
                        umask(0);
                7>标准输入、标准输出、标准错误输出全部重定向到null
                        --->将0 1 2 重定向到    设备:null
                        int fd=open("/dev/null",O_RDWR);
                        dup(0);
                        dup(0);
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
void daemon_init(void);

int main(){
	//守护进程
	daemon_init();
	//打开日志系统
	openlog("刀郎",LOG_PID,LOG_DAEMON);
	
	//以读写的方式打开打开xx.txt文件
	int fd=open("xx.txt",O_RDWR|O_TRUNC);
	if(fd<0){
		syslog(LOG_ERR,"刀郎 open error");		//因为标准出错的文件描述符指向NULL,所以无法使用perror
		exit(-1);
	}
	char buf[20]="huaqingdaolang\n";			//声明一个空间,空间共大小20字节,里面有huaqingdaolang\n
	while(1){									//循环
		sleep(1);								//一秒执行一次下面的代码
		write(fd,buf,strlen(buf));				//写操作,往fd里写buf的内容		
		syslog(LOG_INFO,"%s",buf);				//写入日志,往日志里写buf的内容
	}
	closelog();								//关闭日志
	close(fd);								//关闭fd
	
	return 0;
}


void daemon_init(void){
	//1>创建子进程2,结束父进程1	(为会话做准备)--->进程组的组长不具备设置会话的能力
	if(fork()!=0)
			exit(0);
		
	//2>设置当前子进程为一个会话	(摆脱原终端的影响)
	if(setsid()<0){
		perror("setsid error");
		exit(-1);
	}
		
	//3>创建子进程3,结束父进程2--->让子进程3不具备打开终端的能力
	if(fork()!=0)
		exit(0);
	
	//4>关闭所有文件描述符--->节省资源
	int i;
	for(i=0;i<=sysconf(_SC_OPEN_MAX);i++)
		close(i);
	
	//5>改变执行目录--->将执行目录换到 根目录 下
	chdir("/");
	
	//6>修改掩码--->将掩码修改为0 默认为0002
	umask(0);
	
	//7>标准输入、标准输出、标准错误输出全部重定向到null--->将0 1 2 重定向到	设备:null
	int fd=open("/dev/null",O_RDWR);
	dup(0);//0--fd,产生1
	dup(0);//0--fd,产生2
	
	
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值