守护进程 demo程序

/* daemon.c 创建守护进程实例 */
/* 守护进程,是Linux中的后台服务进程。生存期长,独立于控制台,周期性地执行任务或者等待处理某些事件。
 * 守护进程常在系统引导载入时启动,在系统关闭时终止。Linux的系统服务大多是通过守护进程实现的
 * 守护进程脱离了对控制终端的依赖,
 * */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
	pid_t pid;
	int i, fd;
	char *buf = "This is a Daemon.\n";
	
	pid = fork();
	if (pid<0)
	{
		printf("Error fork \n");
		exit(1);
	}
	else if (pid>0)
	{
		exit(0);/* 父进程退出 */
	}
	setsid(); /* 创建一个新会话,拜托原会话和原控制终端的控制,使得子进程完全独立出来 */
	chdir("/"); /* 让守护进程的当前工作目录为根目录。由于子进程继承了父进程的当前工作目录,那么子进程及守护进程运行期间,工作目录是不能卸载的,这会给系统使用造成很多麻烦。 */
	umask(0); /* 改变文件权限掩码为0.默认是继承父进程的。 */
	for (i=0; i<getdtablesize(); i++)
	{
		close(i);  /* 关闭文件描述符:输入,输出及报错这三个文件 */
	}
	while(1)
	{
		if( (fd=open("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600)) < 0 )
		{
			printf("Open file error!\n");
			exit(1);
		}
		write(fd,buf,strlen(buf)+1);
		close(fd);
		sleep(10);
	}
	exit(0);
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C++守护进程示例代码: ```c++ #include <iostream> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <signal.h> using namespace std; void daemonize() { pid_t pid = fork(); if (pid < 0) { exit(EXIT_FAILURE); } else if (pid > 0) { exit(EXIT_SUCCESS); } if (setsid() < 0) { exit(EXIT_FAILURE); } signal(SIGCHLD, SIG_IGN); signal(SIGHUP, SIG_IGN); pid = fork(); if (pid < 0) { exit(EXIT_FAILURE); } else if (pid > 0) { exit(EXIT_SUCCESS); } umask(0); chdir("/"); for (int i = sysconf(_SC_OPEN_MAX); i >= 0; i--) { close(i); } open("/dev/null", O_RDWR); dup(0); dup(0); } int main() { daemonize(); // 守护进程的主要工作 return 0; } ``` 在main函数中,我们调用了daemonize()函数来实现守护进程的创建。daemonize()函数执行的操作如下: 1. 创建一个子进程,并在子进程中执行守护进程的主要工作; 2. 在子进程中调用setsid()函数,创建一个新的会话,并成为该会话的组长进程,使得守护进程脱离控制终端和登录会话; 3. 忽略SIGCHLD和SIGHUP信号,防止守护进程在子进程结束或者终端挂起时被终止; 4. 创建另一个子进程,并在其中执行工作; 5. 重设文件权限掩码为0,使得守护进程可以访问任何文件; 6. 将当前工作目录切换到根目录,以避免当前目录占用设备或者被删除的情况; 7. 关闭所有打开的文件描述符,以避免守护进程占用文件资源; 8. 将文件描述符0、1、2分别重定向到/dev/null,以避免守护进程产生输出。 守护进程的主要工作可以在daemonize()函数之后进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值