IO学习系列之守护进程

  • 守护进程:
  • 即后台运行的进程,随着系统的启动而启动,随着系统的终止而终止;
  • 创建守护进程的流程:
  • 一、创建孤儿进程(fork函数):
  • 孤儿进程:
  • 子进程没执行结束,父进程就已经退出,此时子进程就变成孤儿进程,不过孤儿进程会被 init进程回收;
  • 二、创建新的会话和新的进程组(setsid函数):
  • setsid函数:
	#include 
	
	#include 
	
	pid_t setsid(void);
	/*
	功能:
	
			如果调用进程不是会话组组长,
		
			会产生一个新的会话和一个新的进程组
		
			新会话的会话id和新进程组的组id,都是调用进程PID
		
			新的会话和进程组中,只有唯一的进程,即调用进程
	
	参数:
	
			无
	
	返回值:
	
		    成功  		调用进程的PID
	
		    失败  	-1 	 重置错误码
	*/
  • 三、进程的工作目录切换到根目录(chdir函数):
  • 可以不切换到根目录,只要保证此工作目录不被删除即可;
  • chdir函数:
	#include 
	
	int chdir(const char *path);
	/*
	功能:
	
			切换进程的工作目录到path指定的目录下
	
	参数:
		
			要切换到的目录
	
	返回值:
	
			成功  0
		
			失败  -1  重置错误码 
	*/
  • 四、设置所创建文件的掩码(umask函数):
  • umask函数:
	#include 
	
	#include 
	
	mode_t umask(mode_t mask);
	/*
	功能:
	
			修改掩码
	
	参数:
	
			要设置的新的掩码
	
	返回值:
	
			总是会成功,返回上一次的掩码
	*/
  • 五、创建日志文件(open函数):
  • 本示例代码采用的是当前的目录下创建日志文件;
	int fd = open("./kkk.log",O_WRONLY|O_CREAT|O_TRUNC,0666);
  • 六、进程的文件描述符(标准输入:0、标准输出:1、标准出错:2)重定向到文件中(dup2函数):
  • dup2函数:
	#include 
	int dup2(int oldfd, int newfd);
	/*
	功能:
	
			将newfd重定向到oldfd中,会关闭newfd
			
	返回值:
	
		    成功  返回新的文件描述符
		    
		    失败  -1  重置错误码
	*/
  • 七、开启自定义服务:
  • 示例代码:
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    pid_t pid = 0;

    int fd = 0;

    char buf[] = "I Love China!!!\n";

    if(-1 == (pid = fork()))
    {
        perror("fork error");
        exit(EXIT_FAILURE);

    }else if(0 < pid){

        exit(EXIT_SUCCESS);

    }else if(0 == pid){

        if(-1 == setsid())
        {

            perror("setsid error");
            exit(EXIT_FAILURE);

        }

        umask(0);

        if(-1 == (fd = open("./kkk.log",O_WRONLY|O_CREAT|O_TRUNC,0666)))
        {
            perror("open error");
            exit(EXIT_FAILURE);
        }

        dup2(fd,0);
        dup2(fd,1);
        dup2(fd,2);

        write(fd,buf,sizeof(buf));

    }

    return 0;
}
  • 运行结果:
linux@ubuntu:~$ gcc k1.c
linux@ubuntu:~$ ./a.out 
linux@ubuntu:~$ cat kkk.log
I Love China!!!
linux@ubuntu:~$ 
  • 仅供参考;

你可能感兴趣的:(学习,c语言,IO,守护进程)