将 UNIX 守护程序移植到 Windows 服务
Posted
技术标签:
【中文标题】将 UNIX 守护程序移植到 Windows 服务【英文标题】:Porting a UNIX daemon to a Windows Service 【发布时间】:2022-01-19 20:48:12 【问题描述】:我用 C 语言编写了一个 UNIX 守护程序,我想将它移植到 Windows。 我的目标是 Windows 10。
当我搜索如何创建 Windows 服务时,我遇到了 approach using .NET and C#,我都想不惜一切代价避免。
如何在 C 语言中创建一个简单直接的服务,而不需要 Microsoft 试图卸载我的厨房水槽?如果真的需要,我会考虑 C++,但 C# 和 .Net 太过分了。
如果在 VisualStudio 之外更容易,我也可以切换到不同的编译器。 (目前我使用的是 Visual Studio 2019,最新更新。)
注意:我的 Linux 守护程序只有一个依赖项:可用于 Windows 的 libhidapi。
更新
没有可用的 C++ 模板。
【问题讨论】:
我不认为你可以。这些太不一样了。您将需要以 Windows 方式重写功能。 @EugeneSh。好,谢谢!一个小的 C 程序不是以前在 Windows 下的方式吗,pre dot Net? @EugeneSh。用 C 语言为 Windows 编写服务并不难——如果我可以访问很久以前为客户编写的框架,我会发布答案。服务启动的方式有点不同——IIRC 它不是来自main()
,甚至不是微软的main()
的任何“供应商锁定”版本。从CreateService()
function 开始构建您的服务。此外,还有更多示例:google.com/…
@AndrewHenle 我没有说难,我说它和Linux/Unix有很大的不同,所以直接移植会是一个挑战
我在前世(大约 1999 年)为 NT 写过服务……我可以做一些探索并尝试记住它是如何工作的。给我几天时间。
【参考方案1】:
这归结为创建两个不同的应用程序 (.exe)
使用StartServiceCtrlDispatcher()
运行服务,其中调度函数调用RegisterServiceCtrlHandlerEx()
注册控制器。
使用CreateService()
安装服务
可以跳过安装程序,并为此使用sc
命令行实用程序,它是操作系统的一部分。
见full example。
【讨论】:
以上是关于将 UNIX 守护程序移植到 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core 中的跨平台后台服务(想想 windows 服务/unix 守护进程)?