Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 一种可靠的系统检测方法_C_Linux_Daemon_Systemd - Fatal编程技术网

C 一种可靠的系统检测方法

C 一种可靠的系统检测方法,c,linux,daemon,systemd,C,Linux,Daemon,Systemd,这是检测守护进程是否从systemd启动的可靠方法吗 #include <systemd/sd-daemon.h> #include <unistd.h> bool DetectSystemd(void) { if (sd_booted() > 0 && getppid() == 1) { return true; } return false; } #包括 #包括 布尔检测系统(无效) { 如果

这是检测守护进程是否从systemd启动的可靠方法吗

#include <systemd/sd-daemon.h> 
#include <unistd.h>   

bool DetectSystemd(void)
{
    if (sd_booted() > 0 && getppid() == 1) {
        return true;
    }

    return false;
}
#包括
#包括
布尔检测系统(无效)
{
如果(sd_booted()>0&&getppid()==1){
返回true;
}
返回false;
}

对我来说,这听起来像个XY问题。我可以想象你为什么会关心这件事的两个原因:

  • 您想知道是在前台模式还是守护程序模式下运行程序
  • 您依赖(可能是可选的)systemd服务
  • 将“daemonize”定义为“(double)fork并退出要重新分配给init的父级,以及处理其他步骤,例如放弃控制终端,…”(编辑:systemd维护人员编写了一个方便的手册页:(不要与
    守护程序(3)
    混淆,这是没有用的)

    传统的守护进程将采用命令行选项--daemonize(如果默认在前台运行)或--前台(如果默认为daemonize)。传递这些标志之一的责任属于启动程序的人(如果是用户)或编写初始化脚本的人(应该是包装商,而不是上游的您)

    现代实践中的趋势已经发生了变化:进程不应该自行处理,而是由守护进程管理器运行,例如启动-停止守护进程(8)(同样,这是打包人员的决定)

    现在systemd变得无处不在,一些最佳实践正在发生变化。例如,现在上游可以提供一个.service文件,而不是每个打包程序都必须提供自己的变体,而现在单独实现daemonization步骤完全没有意义

    对于第二种情况,如果您想使用systemd的一些服务,只需尝试使用它们,并像往常一样检查错误。对于许多应用程序,您还不想让它成为一个硬错误(如果只是为了开发/测试,可能会有一些方法在没有systemd的情况下运行您的程序——但这可能需要更改一些配置选项,这并不容易),但硬依赖现在变得合法了