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

标签 c ipc daemon rpc remote-control

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

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

如果 mediaplayer-daemon 未运行,则由远程 Controller 启动。 Remote 将传递消息。

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

  • 客户端应用程序尝试连接(),如果不能则启动守护进程
  • 客户端使用argp将params解析成一个struct
  • 客户端通过套接字发送结构
  • 服务器接收结构并解释它

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

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

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

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

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

最佳答案

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

关于c - 用于基于 C 的远程控制/守护进程 (IPC/RPC) 的优雅 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084541/

相关文章:

c - fork 后 libev 出现段错误

c - 从使用 fmemopen 创建的流中读取宽字符

Android:AIDL 的安全 IPC 替代品?

c - 通过在另一个控制台中再次执行后台进程来结束它,如何完成?

c - 如何访问另一个结构体内部的结构体

c - printf 的意外输出

c - 如果 parent 不调用 wait(),则同一 parent 的两个 child 不会使用管道进行通信

使用轮询无法从命名管道中读取一个以上的单词

perl - 为什么我的 perl 守护进程不打印?

php - 为 Linux 守护进程制作安装包