守护进程(daemon)笔记

ps命令

用来看进程号的
ps -aux
ps -ajx
ps -aux | grep “syslogd”
等等

kill

用来结束进程的
kill -9 1234 ()1234是进程号

什么是守护进程(daemon)

守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。

特点

  1. 长期运行
  2. 与控制台脱离(控制台例子:linux的终端,tty…)

守护进程用来干嘛

作用:服务器一般都实现为守护进程
常见:syslogd------------系统日志
cron-----------------实现操作系统的时间管理,定时执行程序功能。

写守护进程

setsid

SYNOPSIS
#include <sys/types.h>
 #include <unistd.h>
   pid_t setsid(void);

setsid函数能够使进程完全独立出来,从而脱离所有其他进程的控制。

chidir

SYNOPSIS
   #include <unistd.h>
   int chdir(const char *path);

这里把路径改为当前路径
使用fork创建的子进程也继承了父进程的当前工作目录。由于在进程运行过程中,当前目录所在的文件系统不能卸载,因此,把当前工作目录换成其他的路径,如“/”或“/tmp”等。改变工作目录的常见函数是chdir。

sysconf

NAME
   sysconf - get configuration information at run time
SYNOPSIS
   #include <unistd.h>

   long sysconf(int name);

实现代码

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

void create_deamon(void)
{
	//1 创建子程序,终止父程序
	pid_t pid = -1;
	pid = fork();
	if (pid < 0)
	{
		perror("fork");
		exit(-1);
	}
	if (pid > 0)
	{
		exit(0);
	}
	// 在子程序中创建新会话
	if (0 == pid )//记得是“==” 不要“=” ,之前一直实现不了就是因为等号的问题
	{
		pid_t pid_s = -1;
		pid_s = setsid();
		if (-1 == pid_s) //记得是“==” 不要“=” ,之前一直出错就是因为等号的问题
		{
			perror("setsid");
			exit(-1);
		}
		printf("the new session ID of the calling precess is %d\n",pid_s);
		
		//改变工作目录为当前目录
		chdir("/");
		//重设文件创建掩码
		umask(0);
		//关闭文件描述符
		//有好多个文件,而且是动态的,全都要关闭,所以通过sysconf,里面传参看man手册,得到最大的能打开的fd数
		int open_max = 0;
		open_max = sysconf(_SC_OPEN_MAX);
		int i = 0;
		for (i = 0;i < open_max; i++)
		{
			close(i);
		}
		//把标准输入输出定位到/dev/null 因为全都关了,所以按顺序fd分别是012,对应标准输入输出
		
		open("/dev/null",O_RDWR);
		open("/dev/null",O_RDWR);
		int fd = open("/dev/null",O_RDWR);
		printf("???fd = %d",fd);

	}
}

int main()
{
	create_deamon();
	
	while(1)
	{
		printf("happy\n");
		sleep(1);
	}
	return 0;
}

发布了38 篇原创文章 · 获赞 1 · 访问量 1036

猜你喜欢

转载自blog.csdn.net/qq_40897531/article/details/104157907