新手如何写守护进程

有问题加qq2410474020 互相学习


新手如何写守护进程daemon


守护进程又称精灵进程----脱离终端
在你身后默默运行,脱离终端
守护进程由会话的领头进程来担任

守护进程创建的步骤
a)更改文件权限
b)创建子进程,让父进程直接退出
3)使用setid让子进程变成会话的领头进程
i.pid_t setsid(void);
ii.返回值:
4)忽略子进程退出的信号
i.Signal(SIGCHLD,SIG_IGN);
5)将工作目录改为根目录
i. int chdir(const char *path);
ii.参数:要更改的目录路径
iii.返回值:成功返回0 失败返回-1
6)重定向/dev/null

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>


int my_daemon(void)
{
	//第一步  更改文件权限
	/*关于umask  可以man一下进行查询,对于进程来说,只需要了解
	由于使用了fork()函数新建的子进程继承了父进程的文件权限掩码
	这就给孩子进程使用文件带来了一定的影响。因此把权限掩码设置为0即
	umask(0),可以增强该守护进程的灵活性。*/
	
	umask(0);
	
	//第二步,创建子进程,让父进程直接退出
	pid_t pid=fork();
	
	if(pid<0)
	{
		perror("[error]");
		return -1;
	}
	
	else if(pid>0)
		exit(0);

	//第三步,使用setid让子进程变成会话的领头进程
	/*关于*/
	setsid();
	
	//第四步,忽略子进程退出的信号

	/*signal函数:
	typedef void (*sighandler_t)(int);
	*/
	(void )signal(SIGCHLD,SIG_IGN);

	
	//daemon(0,0);
	//第五步,将工作目录改为根目录
	chdir("/");
	//第六步,重定向,把无关信息输入到/dev/null中
	freopen("/dev/null","w+",stdin);
	freopen("/dev/null","w+",stdout);
	freopen("/dev/null","w+",stderr);

}

int main()
{
	my_daemon();
	FILE *fp=fopen ("/mnt/hgfs/gongxiang/file_io/txt.c ","w+");
	time_t loc_time;
	while(1)
	{
		loc_time=time(NULL);
		fprintf(fp,"time:%s",ctime(&loc_time));
		fflush(fp);
		sleep(2);
		
	}
	
	return 0;
}

写完后在编译运行
然后输入ps ajx
就能看到守护程序正在运行
我要运行的文件是./1116
在这里插入图片描述
关闭需要输入kill 6038
如果不杀死
就会出现下次无法编译运行此文件
显示请求被拒绝ld returned 1 exit status

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公孙无语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值