用于基于 C 的远程控制/守护程序(IPC/RPC)的优雅 API?

Posted

技术标签:

【中文标题】用于基于 C 的远程控制/守护程序(IPC/RPC)的优雅 API?【英文标题】:An elegant API for a C-based remote-control / daemon (IPC / RPC)? 【发布时间】:2010-11-03 05:58:26 【问题描述】:

我有一个守护进程(必须用 C 编写),它应该有一个遥控器,就像普通媒体播放器一样:

mediaplayer-rc --enqueue /path/to/song.mp3

如果mediaplayer-daemon 没有运行,它由遥控器启动。遥控器将传递消息。

我采用了对我来说最直观的方法:

客户端应用程序尝试 connect() 并启动守护程序(如果不能) 客户端使用argp将参数解析为结构体 客户端通过套接字发送结构 服务器接收结构并解释它

我有一个simple demo implementation using libev and unix sockets on github。

我的理由是,用 C 编写客户端似乎更容易,我可以使用它们的 system() 版本从其他语言调用,而不是尝试将另一种语言正确地添加到 pack 结构或获取 C 库解析其他格式。

但我不认为这是一个特别优雅的解决方案。

另一种可能性是使用 JSON。缺点是在 vanilla C 中使用 JSON 解析器可能比 args 解析器复杂得多。结果是 JSON(或 YAML)在几乎所有其他语言的标准库中。

有什么建议吗?有人知道 songbird、gimp、itunes 和其他带有遥控器的应用程序是如何处理这个问题的吗?

【问题讨论】:

【参考方案1】:

我不能推荐一个现成的库 - 相反,我建议您查看 Music Player Daemon。它使用一个非常简单的文本协议来远程控制整个应用程序。有几个clients(带代码)你也可以看看。

【讨论】:

这是一个很好的资源。我想看看其他一些实现,但我认为字符串是最可靠的方法。

以上是关于用于基于 C 的远程控制/守护程序(IPC/RPC)的优雅 API?的主要内容,如果未能解决你的问题,请参考以下文章

用C#编写Linux守护进程

守护进程, 协同进程, 僵尸进程, 孤儿进程概念理解

基于 Spring Boot (Tomcat) 的应用程序作为守护进程 - 如何停止?

如何授权来自不同 AAD 租户的特定客户端守护程序?

.NET跨平台实践:用C#开发Linux守护进程

.NET跨平台实践:用C#开发Linux守护进程(转)