Linux C 创建守护进程步骤

本文介绍了Linux系统中创建守护进程的步骤,包括成为孤儿进程、创建新会话、更改运行目录、修改文件掩码及关闭文件描述符。示例代码展示了如何实现这些步骤,并解释了相关函数如fork()、setsid()、chdir()和umask()的作用。通过这些操作,守护进程可以在后台独立运行,不受终端影响。
摘要由CSDN通过智能技术生成

Linux C 创建守护进程步骤

前言

我觉得在学习如何学习创建守护进程前首先应知道何为守护进程,那么什么是守护进程呢?

刘忆智等编著的《Linux从入门到精通》(第2版)一书中是这样定义的:守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。而我理解的是:运行于后台,且不会受终端控制的特殊进程。

下面我们先来看下一个创建守护进程的过程。

  1. 创建孤儿进程(创建子进程,终止父进程):fork(),exit();
  2. 创建一个新的会话,成为会话组长:setsid();
  3. 更改程序运行目录:chdir();
  4. 修改文件掩码:umask();
  5. 关闭文件描述符:getdtablesize(),close();

下面我们来看下完整的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/stat.h>
#include <unistd.h>

int main()
{
	//成为孤儿
	pid_t pid = fork();
	if(pid == -1)
	{
		perror("fork");
		exit(-1);
	}
	else if(pid > 0)
	{
		exit(0);
	}
	//创建新会话
	if(setsid()== (pid_t)-1)
	{
		perror("setsid");
		exit(-1);
	}
	//更改运行目录
	if(-1 == chdir("/tmp"))
	{
		perror("chdir");
		exit(-1);
	}
	//修改文件掩码
	umask(0);
	//关闭文件描述符
	int i;
	for(i = 0; i < getdtablesize(); i++)
	{
		close(i);
	}
	while(1)
	{
		//任务处理
		printf{"Hello World !"};
	}
	exit(0);
}

下面详细介绍一下几个函数:

创建进程fork()

函数功能:创建一个子进程(相对当前进程)
函数头文件

#include <sys/types.h>
#include <unistd.h>

函数原型:

pid_t fork(void);

函数返回值:
成功:主进程返回子进程pid号,子进程返回0
失败:返回-1和错误码
例如:

pid_t pid = fork();
switch(pid)
{
	case -1:
	{
		perror("Fork");
		exit(0)}
	case 0:
	{
		while(1)
		{
			//子进程
		}
		break;
	}
	default{
		while(1)
		{
			//主进程
		}
		break;
	}
}

新建一个会话setsid()

函数功能:创建会话并设置进程组ID
函数头文件

 #include <unistd.h>

函数原型

pid_t setsid(void);

函数返回值:
成功:返回会话组id
失败:返回-1和错误码

更改目录chdir()、fchdir()

函数功能:更改工作目录
函数头文件

 #include <unistd.h>

函数原型

int chdir(const char *path);
int fchdir(int fd);

函数返回值
成功:返回0
失败:返回-1和错误码
参数说明
path:文件路径
fd:文件描述符

修改文件掩码umask()

函数功能:设置并获取文件模式创建掩码
函数头文件

#include <sys/stat.h>

函数原型

mode_t umask(mode_t cmask);

函数返回值
此函数总是返回为成功,使用时可不做错误判断
参数说明
cmask:权限值

获取文件描述符表大小getdtablesize()

函数功能:获取文件描述符表大小
函数头文件

#include <sys/stat.h>

函数原型

int getdtablesize(void);

函数返回值
当前对每个进程打开的文件数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Reil.kun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值