守护进程24.10.21

在Linux系统中,守护进程(Daemon)是一种在后台运行的特殊进程,通常用于执行特定的系统任务。要创建一个守护进程,你需要做几件事情:
1. 在后台运行。
2. 关闭所有继承来的文件描述符。
3. 创建一个新的会话和进程组。
4. 改变当前工作目录。
5. 重设文件权限掩码。
6. 设置守护进程的umask。
7. 守护进程应该处理信号。
下面是一个简单的守护进程示例,它会在启动后将自己的进程名改为newdemo:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <signal.h>
#include <libgen.h>
#include <sys/resource.h>

// 忽略这些信号,因为我们不想被它们终止
void ignore_signals() {
signal(SIGCHLD, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
signal(SIGTTOU, SIG_IGN);
signal(SIGTTIN, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, SIG_IGN);
}

// 设置守护进程的资源限制
void set_resource_limits() {
struct rlimit rl;
// 限制守护进程的最大文件描述符数量
rl.rlim_max = 1024;
rl.rlim_cur = 1024;
setrlimit(RLIMIT_NOFILE, &rl);
}

// 守护进程的主函数
int main(int argc, char *argv[]) {
// 检查是否以root权限运行
if (getuid() != 0) {
fprintf(stderr, "Must be run as root\n");
exit(EXIT_FAILURE);
}

// 忽略不需要的信号
ignore_signals();

// 设置资源限制
set_resource_limits();

// 创建一个新的会话和进程组
if (daemon(0, 0) < 0) {
perror("daemon");
exit(EXIT_FAILURE);
}

// 关闭所有继承来的文件描述符
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

// 改变当前工作目录
if (chdir("/") < 0) {
perror("chdir");
exit(EXIT_FAILURE);
}

// 重设文件权限掩码
umask(0);

// 开启日志记录
openlog(basename(argv[0]), LOG_PID, LOG_DAEMON);

// 打印一条日志信息
syslog(LOG_INFO, "newdemo daemon started");

// 改变进程名称
char *new_argv[] = {"newdemo", NULL};
prctl(PR_SET_NAME, "newdemo", 0, 0, 0);

// 守护进程的主要工作逻辑
while (1) {
// 这里可以添加守护进程需要执行的代码
// 例如,定时执行任务,监控文件变化等
sleep(60); // 每60秒执行一次
}

// 关闭日志
closelog();

return 0;
}

编译这个程序时,你需要链接到libgen.h库,使用如下命令:
gcc -o newdemo newdemo.c -lpthread
bash
请注意,这个程序需要以root权限运行,因为它使用了daemon()函数,并且需要改变进程名称,这通常需要管理员权限。此外,改变进程名称的功能是通过prctl()系统调用实现的,这在某些系统上可能不可用或行为不同。
在实际部署守护进程时,你可能需要编写一个启动脚本来管理这个守护进程的启动、停止和重启。这通常涉及到使用systemd或init.d脚本。

ls ls-l ./hello ps -ef top ps -ef | grep hello cat /proc/11307/stat

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值