Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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++ 编写linux守护进程的最佳方法_C++_Linux_Daemon - Fatal编程技术网

C++ 编写linux守护进程的最佳方法

C++ 编写linux守护进程的最佳方法,c++,linux,daemon,C++,Linux,Daemon,为了工作,我需要编写一个tcp守护进程来响应我们的客户机软件,我想知道是否有人对最好的方法有什么建议 我是否应该像通常使用线程一样为每个新连接分叉?这取决于您的应用程序。线程和分叉都是非常有效的方法,也是单线程事件驱动模型的第三种选择。如果你能更准确地解释一下你在写什么,这将有助于提供建议 关于它的价值,以下是一些一般性的指导原则: 如果没有共享状态,请使用分叉 如果您有共享状态,请使用线程或事件驱动系统 如果在大量连接下需要高性能,请避免分叉,因为分叉具有更高的开销(特别是内存使用)。相反,

为了工作,我需要编写一个tcp守护进程来响应我们的客户机软件,我想知道是否有人对最好的方法有什么建议


我是否应该像通常使用线程一样为每个新连接分叉?

这取决于您的应用程序。线程和分叉都是非常有效的方法,也是单线程事件驱动模型的第三种选择。如果你能更准确地解释一下你在写什么,这将有助于提供建议

关于它的价值,以下是一些一般性的指导原则:

  • 如果没有共享状态,请使用分叉
  • 如果您有共享状态,请使用线程或事件驱动系统
  • 如果在大量连接下需要高性能,请避免分叉,因为分叉具有更高的开销(特别是内存使用)。相反,使用线程、事件循环或多个事件循环线程(通常每个CPU一个)

一般来说,分叉将是最容易实现的,因为一旦分叉,您基本上可以忽略所有其他连接;由于额外的同步要求,线程是下一个最难的线程;由于需要将处理转换为状态机,事件循环更加困难;而运行事件循环的多线程是其中最困难的(由于结合了其他因素)。

我建议在任何一天通过线程进行连接。线程的问题是共享内存空间,以及操作另一个线程的内存有多容易。对于分叉流程,流程之间的任何通信都必须由您有意完成


刚刚搜索并找到了这样的答案:。您显然知道答案,但该线程中的#1答案对fork()的优点有很好的说明。

除了@hobodave的好答案外,“每个连接分叉”的另一个好处是您可以非常简单地实现服务器,通过使用
inetd
tcpserver
等:然后可以使用标准输入和标准输出与套接字通信,而不必执行任何侦听套接字管理(侦听连接等)等。

当然,还有另一个选项,正在预分叉守护进程的多个副本,并使每个副本保持活动状态并继续响应请求。这完全取决于您的应用程序、预期负载和性能要求等


最简单的方法是编写一个基于inetd的守护进程;您的软件可以忽略通过TCP连接运行的事实,只需通过stdin/stdout处理输入/输出。这在绝大多数情况下都很有效。

< P>如果你不打算每秒被许多新的连接锤击,考虑从iNETD运行。否则

下载OpenSSH源代码。他们在特权分离方面做了大量的工作,它是可移植的,而且它的安全性比其他任何东西都要严格

根据你的需要调整它,你可能会扔掉大部分。当然要遵守许可协议。使用良好的SCC跟踪未来的修补程序

在你有足够的证据证明这是一个真正的问题之前,不要担心分叉进程和线程的性能。Apache多年来一直在运行最繁忙的站点,只需简单的每客户端流程模型

如果你真的很有野心,你可以使用某种非阻塞异步IO模型。我喜欢Boost,Asio,但是我对C++很有兴趣。 确保代码正确处理信号。HUP以重新加载配置。术语优雅地关闭


不要试图编写自己的日志文件。只使用syslog,或者只写可以重定向到syslog的stderr。尝试在所有日志略有不同的家用服务器上设置logrotate是一件非常痛苦的事情。

如果您想避免同时使用线程/分叉,我建议使用所有非阻塞I/O。
Libevent作为事件驱动编程的高性能解决方案而广为人知

调查。它有许多线程、事件和分叉TCP反应器,可以满足您的通信需求。您还可以查看哪个做了类似的事情

分叉的内存开销不是太大,这是由于进程内存在写入时复制的方式造成的。主要的缺点是fork()所需的时间,但是如果您不以高频率创建和销毁连接,那么这不应该是一个showstepper。没错,但它可以比一个带有文件描述符和输入缓冲区的小结构多得多:)另一个好处是,中止的线程可能会搁浅或使整个应用程序崩溃。正如另一个答案中所建议的,您可以设置工作进程池。考虑使用一个简单的委托程序来对工人协同处理队列的工作进行排队。此设置使您能够更好地控制系统资源。