C++采用Daemon进行后台程序部署

举报
梦笔生花 发表于 2023/07/17 20:51:57 2023/07/17
【摘要】 一、如何采用Daemon进行后台程序的部署在C++中,如果要让一个程序一直在后台运行并且和终端会话分离,我们可以将其作为守护进程运行,以下是创建C++守护进程的一般步骤。1. 创建子进程通过调用fork()函数创建一个子进程。这将产生一个新的进程,该进程是原始进程的副本。父进程和子进程从fork()函数的返回值处开始执行。对于子进程,fork()返回0,对于父进程,fork()返回子进程的进...

一、如何采用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;
}



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。