守护进程Linux

本文详细介绍了守护进程的工作原理,包括会话的概念、sid和pgid的应用,以及如何通过fork(), setsid(), 和其他系统调用来实现守护进程的编程流程。重点讲解了如何防止窗口关闭导致进程结束,并通过例子展示了如何编写一个不断追加写入日志的守护进程。
摘要由CSDN通过智能技术生成

1_10守护进程
守护进程:运行周期长,在后台运行,不和用户交互

会话

会话sid

会话首进程的id作为这个会话的id

会话首进程:一般是bash

会话里面有很多进程进程组,进程组的第一个进程id命名这个进程,进程消失,进程组名不变,除非整个进程消失,进程组才会消失。

即使第一个进程消失,会话id不变。

printf("pid=%d,sid=%d,gid=%d\n",getpid(),getsid(0),getpgrp());

为了防止关闭窗口进程结束,关闭之后重新开辟一个会话,将要守护的进程移到这个进程里面,这个进程不能是哪个进程的首进程,必须是一个普通的组员进程,他会成为这个会话的首进程。

守护进程的编程流程

在这里插入图片描述

1.fork()   退出父进程
2.setsid()   建立新会话
3.fork()   退出父进程
4.chdir("/")因为运行时间较长,将他放在根目录底下,防止被关闭。
5.umask(0)   清除掩码,可能没有一些权限但你又要用,等于说是放开权限
6.close()    关掉不用的描述符
7.处理僵死进程
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>

int  main
{
	pid_t pid=fork();
	if(pid!=0)
	{
		exit(0);
	}
	setsid();
	
	pid=fork();
	if(pid!=0)
	{
		exit(0);
	}
	
	chdir("/");
	
	umask(0);
	
	int maxfd=getdtablesize();
	for(int i=0;i<maxfd;i++)
	{
		close(i);
	}
	while(1)
	{
		FILE * fp=fopen("/tmp/c219d.log","a");
		if(fp==NULL)
		{
			break;
		}
		time_t tv;//获取本地时间
		time(&tv);
		fprintf(fp,"Time is %s",asctime(localtime(&tv)));//将时间转换成能看懂的
		
		fclose(fp);
		
		sleep(5);
	}
}
想要查看文件的最后几行

tail  -f c219d.log

一直在后台运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值