[C++]-Linux中创建Daemon程序

Linux中的守护进程(daemon进程)相当于Windows中的后台服务程序,一直运行于后台。

守护进程

Linux中,每一个与用户进行交流的界面称为终端,每一个从此终端允许的进程都会依附于此终端,因此这个终端也称为这些进程的控制终端;当控制终端被关闭时,相应的进程都会自动关闭。若不想让进程因终端的关闭或变化而受影响,就需要把进程变为守护进程。

守护进程(Daemon进程)是脱离于终端(避免进程在执行过程中的信息在任何终端上显示,且进程也不会被任何终端所产生的信息打断)且在后台运行的进程。

后台进程

有多个命令与后台进程有关:

  • &:放在命令后面,让命令在后台运行(但依然受终端控制,终端退出时也会退出);若有输出,依然会在终端中显示;
  • nohup:在系统后台不挂断地运行命令,退出终端不会影响程序的运行(输出会重定向到nohub.out文件中);但会阻挡当前输入,若要真正后台,需要与&一起使用;

查看当前作业(后台运行程序):

  • jobs:查看当前有多少后台运行命令(只能查看当前终端的);
  • Ctrl+z:将一个前台执行的命令放到后台,并处于暂停状态;
  • fg <num>:把指定命令(作业号,jobs显示的),调到前台继续运行;
  • bg <num>:将后台暂停的命令(作业号,jobs显示的),变为后台继续运行(相当于在命令后+&继续运行);
# cliTest是一个定时(1s)输出一条日志的,不间断程序
> ./cliTest & # 后台运行(但终端上一直显示输出),且终端退出时程序也退出

> nohup ./cliTest # 后台运行,会阻挡输入;但终端退出时程序会继续运行

> nohup ./cliTest > nohup.out & 2>&1 # 以后台方式运行,且输出(标准与错误)重定向到nohub;此方式相当于启动了一个后台守护进程

编写守护进程

常见的编写守护进程有fork与daemon两种方式。

fork

通过fork子进程,然后退出父进程的方式实现:

#include "logHelper.h"
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>

void testFork(){
    pid_t pid = fork();
    if(pid<0){
        LOG(ERROR)<<"Can't create subprocess";
        return;
    }else{
        if(pid!=0){ // parent
            exit(0);
        }
    }

    setsid();
    if(chdir("/")<0){
        LOG(ERROR)<<"Can't change dir";
        exit(-1);
    }

    int fd = open("/dev/null", O_RDWR);
    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);

    int count=0;
    while (1){
        sleep(1);
        LOG(INFO)<<++count<<" : testFork ...";
    }
}

实现流程说明:

  • fork成功后,父进程退出;
  • 子进程调用setsid(),来创建新的进程会话(并成为会话首进程),从而脱离和终端的关联;
  • 将当前工作目录切换到根目录:非必须,避免因进程使用当前目录,而影响目录操作(如卸载当前目录所在系统等);
  • 重定向输入输出到/dev/null,通过dup2把标准输入、输出重定向;

daemon

Linux中专门提供了一个系统函数daemon,用于创建守护进程:

int daemon(int nochdir, int noclose);
  • nochdir:为0表示改变当前目录为根目录,1不改变;
  • noclose:为0表示重定向输入、输出到/dev/null,1不重定向;
void testDaemon(){
    LOG(INFO)<<"testDaemon start";
    if(daemon(1, 0) == -1){
        std::cout<<"error\n"<<std::endl;
        exit(-1);
    }

    LOG(INFO)<<"testDaemon after daemon";
    int count=0;
    while (true){
        sleep(1);
        LOG(INFO)<<++count<<" : testDaemon ...";
//        std::cout<<"testDaemon..."<<std::endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
rsync是一个用于文件同步和备份的实用工具,而rsync--daemon是rsync的守护进程模式。通过启动rsync守护进程,可以在Linux系统上运行rsync服务,允许其他计算机通过网络连接并与之通信。 要在Linux上启动rsync守护进程,可以按照以下步骤进行操作: 1. 确保你已经安装了rsync软件包。如果没有安装,可以使用适合你的Linux发行版的包管理器进行安装。 2. 编辑rsync的配置文件,通常位于/etc/rsyncd.conf。可以使用文本编辑器(如vi或nano)打开该文件。 3. 在配置文件,你可以定义rsync守护进程的参数和模块。模块是指定要同步的目录或文件集合。你可以为每个模块指定不同的参数和权限。 以下是一个示例配置文件的简单示例: ``` # /etc/rsyncd.conf # 全局配置 uid = nobody gid = nobody use chroot = yes max connections = 10 log file = /var/log/rsyncd.log # 模块定义 [module1] path = /path/to/module1 comment = Module 1 read only = yes list = yes [module2] path = /path/to/module2 comment = Module 2 read only = no list = yes ``` 在这个例子,我们定义了两个模块(module1和module2),分别指向不同的目录,并设置了相应的权限和注释。 4. 保存并关闭配置文件。 5. 启动rsync守护进程。在终端执行以下命令: ``` rsync --daemon ``` 如果一切顺利,rsync守护进程将会启动,并开始监听指定的端口(默认为873)。 现在,其他计算机可以使用rsync客户端连接到你的Linux系统上的rsync守护进程,并进行文件同步和备份操作。例如,可以使用以下命令从客户端同步文件到服务器: ``` rsync -avz /path/to/source username@server_ip::module_name ``` 其,/path/to/source是要同步的源文件或目录,username是具有合适权限的用户名,server_ip是运行rsync守护进程的服务器IP地址,module_name是在配置文件定义的模块名称。 这是关于在Linux上使用rsync--daemon的简要说明。有关更多详细信息和参数选项,请查阅rsync的官方文档或执行`man rsync`命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值