C++ 通用守护程序/服务器设计-最佳实践(C/C+;+;,Linux)

C++ 通用守护程序/服务器设计-最佳实践(C/C+;+;,Linux),c++,c,linux,daemon,C++,C,Linux,Daemon,这些问题相当普遍,因为它们在不同的情况下不断出现在我面前。我希望有一些基本原则/标准实践 典型要求: 一种类似于“服务器”的程序,在linux中运行 后台(几乎不间断运行。可能每天或每周重新启动) 通过一些套接字协议处理客户端连接 具有启动配置文件 输出到一个或多个日志文件 我的问题是: 我应该以“守护进程”的形式编写程序吗?在选择守护进程和非守护进程时,我应该考虑什么? 日志文件和配置文件应该放在linux文件夹层次结构中的什么位置?我应该从某个用户的主目录或某个用户主目录的子文件夹中运行它吗

这些问题相当普遍,因为它们在不同的情况下不断出现在我面前。我希望有一些基本原则/标准实践

典型要求:

  • 一种类似于“服务器”的程序,在linux中运行 后台(几乎不间断运行。可能每天或每周重新启动)
  • 通过一些套接字协议处理客户端连接
  • 具有启动配置文件
  • 输出到一个或多个日志文件
  • 我的问题是:

  • 我应该以“守护进程”的形式编写程序吗?在选择守护进程和非守护进程时,我应该考虑什么?
  • 日志文件和配置文件应该放在linux文件夹层次结构中的什么位置?我应该从某个用户的主目录或某个用户主目录的子文件夹中运行它吗?或者我应该创建一个新文件夹,即/my_server\u abc/,然后从那里运行它,并将日志文件写入该目录

  • 谢谢

    您应该编写一个真正的守护程序(后台分支到发布tty)。这使得在系统启动时运行软件变得容易,这是最佳实践

    对于日志记录,您应该将日志保存在默认位置:
    /var/log
    。您甚至可能希望使用
    syslog
    进行日志记录,因为这是linux下的默认设置,您不需要关心日志文件的处理

  • 使用
  • 遵循规则

  • 我知道你在问这个问题时考虑的是c/c++,但我认为它比这更一般,设计时使用的逻辑独立于用于实现的语言

    有一个python增强方案()用于描述标准守护进程库,该库现在已成为该语言的一部分。若您在正确的守护程序行为部分中查看,它将描述守护程序应该如何操作。还需要考虑“服务”和守护进程之间的差异

    我认为这应该很好地回答您关于守护进程及其行为的一般问题。请查看,您可以找到有关“Unix网络编程”的信息,Prentice Hall提供了在*nix环境中编写守护程序时特定于c/c++的更多信息和最佳实践

  • 我应该以“守护进程”的形式编写程序吗 没有

    不要试图将自己后台化。使用操作系统提供的工具,使您的应用程序从启动脚本在后台运行,如Debian/Ubuntu中的
    start-stop-daemon
    。Systemd和upstart也可以在它们的启动脚本中为您处理这个问题,现在大多数init系统也是如此


    编写守护进程有一些您可能无法预料的缺陷,而大多数现代init脚本也不希望您将自己的进程发送到后台,这将使它们的工作变得复杂。例如,这允许生成可靠的
    .pid
    文件来跟踪应用程序的进程id。如果您自己进行后台监控,您的init系统必须依靠您的应用程序以某种方式正确通信您的进程id,因为您生成了init系统无法跟踪的新pid。这让他们和你的事情都复杂化了。

    下次,这应该是两个单独发布的问题。我想基本的问题会给你提供信息。