DeskFlow 跨平台抽象层之(05) — 守护进程

1. 守护进程设计


  IArchDaemon是Deskflow中平台抽象层的核心接口之一,专门负责提供跨平台的守护进程功能,为不同操作系统平台的守护进程操作提供统一的编程接口。IArchDaemon接口继承自IInterface,该接口使用函数类型别名DaemonFunc来定义守护进程的主函数签名。


2. 接口主要功能

2.1. 守护进程安装与卸载

1
2
3
4
5
6
7
    // 安装与卸载
    virtual void installDaemon(const char *name, const char *description, const char *pathname, const char *commandLine, const char *dependencies) = 0;
    virtual void uninstallDaemon(const char *name) = 0;
    
    // 默认安装与卸载
    virtual void installDaemon() = 0;
    virtual void uninstallDaemon() = 0;

2.2. 守护进程化操作

1
2
    // 将当前进程转换为守护进程
    virtual int daemonize(const char *name, DaemonFunc const &func) = 0;

2.3. 状态查询功能

1
2
3
4
    // 检查用户是否有权限安装守护进程
    virtual bool canInstallDaemon(const char *name) = 0;
    // 检查守护进程是否已安装 
    virtual bool isDaemonInstalled(const char *name) = 0;

3. IArchDaemon代码解释

 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
class IArchDaemon : public IInterface
{
public:
    // 守护进程的主逻辑函数类型
    using DaemonFunc = std::function<int(int, const char **)>;

    // 安装指定名称的守护进程
    virtual void installDaemon(
        const char *name, const char *description, const char *pathname, const char *commandLine, const char *dependencies
    ) = 0;

    // 卸载指定名称的守护进程
    virtual void uninstallDaemon(const char *name) = 0;
    
    // 安装默认守护进程
    virtual void installDaemon() = 0;

    virtual void uninstallDaemon() = 0;

    // 将当前进程转化为守护进程。
    virtual int daemonize(const char *name, DaemonFunc const &func) = 0;

    // 检查当前用户是否有权限安装/卸载守护进程。
    virtual bool canInstallDaemon(const char *name) = 0;

    // 检查指定守护进程是否已安装。
    virtual bool isDaemonInstalled(const char *name) = 0;

    // 获取当前进程的启动命令行。
    virtual std::string commandLine() const = 0;
};

4. 平台特定功能

4.1. Windows平台特性

Win平台的守护进程实现比较复杂。

  • 静态方法 runDaemon() 用于运行守护进程主循环。
  • daemonRunning() 和 daemonFailed() 方法用于状态管理。
  • getDaemonQuitMessage() 处理Windows服务控制消息。

4.2. Unix平台特性

Unix实现相对简单,主要专注于进程的守护进程化操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#define ARCH_DAEMON ArchDaemonUnix

class ArchDaemonUnix : public ArchDaemonNone
{
public:
  ArchDaemonUnix() = default;
  ~ArchDaemonUnix() override = default;

  // IArchDaemon overrides
  int daemonize(const char *name, DaemonFunc const &func) override; // 进程守护进程化
};

4.3. 不支持守护进程的平台

ArchDaemonNone提供了一个"空"实现,适用于不支持守护进程概念的平台,其中安装和卸载函数什么都不做,查询函数返回false。

comments powered by Disqus