DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

文章目录

  • 一、如何采用Daemon进行后台程序的部署
    • 1. 创建子进程
    • 2. 终止父进程
    • 3. 创建新的会话
    • 4. 改变当前工作目录
    • 5. 重设文件权限掩码
    • 6.关闭不需要的文件描述
  • 二. 代码示例

 


一、如何采用Daemon进行后台程序的部署

在C++中,如果要让一个程序一直在后台运行并且和终端会话分离,我们可以将其作为守护进程运行,以下是创建C++守护进程的一般步骤。

1. 创建子进程

通过调用fork()函数创建一个子进程。这将产生一个新的进程,该进程是原始进程的副本。父进程和子进程从fork()函数的返回值处开始执行。对于子进程,fork()返回0,对于父进程,fork()返回子进程的进程id

2. 终止父进程

在父进程中,使用exit()函数使得其正常退出。这样做是为了让子进程成为孤儿进程进而被init进程(进程ID为1)接管,并且脱离原来的会话。

3. 创建新的会话

在子进程中,调用setsid()函数创建一个新的会话,这将使得子进程成为新会话的领导进程,并且摆脱原来的控制终端。

4. 改变当前工作目录

使用chdir()函数来创建一个新的会话,这将使得子进程成为新会话的领导进程,同时摆脱原来的控制终端。

5. 重设文件权限掩码

通过调用unmask()函数设置一个合适的文件权限,确保守护进程创建的文件具有合适的权限。

6.关闭不需要的文件描述

守护进程通常不需要和用户交互,因此你可以关闭不需要的文件描述符,如标准输入,标准输入和错误文件描述符

二. 代码示例

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<cstdlib>
using namespace std; //不推荐使用这种写法,但是这里我为了省事就直接这样写了
int main(){
pid_t pid = fork();
if(pid < 0){cerr<<"Error : Fork Failed!"<<endl;exit(1);
}
if(pid > 0){//Father exit(0);
}
if(setsid() < 0){cerr <<"Error : Setsid Failed"<<endl;exit(1);
}
unmask(0);
chdir("/");//close unnecessary file description
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);while(true){//daemon logic;sleep(5);}
return 0;
}
posted on   DoubleLi  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2015-06-12 glibc的了解,对内核的封装
2015-06-12 Linux中应用程序如何使用系统调用syscall
2015-06-12 linux下syscall函数,SYS_gettid,SYS_tgkill
2015-06-12 可变参数宏__VA_ARGS__和...
2015-06-12 宏定义中的##操作符和... and _ _VA_ARGS_ _
2015-06-12 宏 #,##,_ _VA_ARGS_ _
2015-06-12 linux网络配置相关文件
点击右上角即可分享
微信分享提示