【问题标题】:Code design for main program + configuration module主程序+配置模块的代码设计
【发布时间】:2015-08-13 09:51:05
【问题描述】:

我有一个主程序 X,它正在从我的网络摄像头获取信息。
我想在执行时实时配置 X
我知道这样做的一种常见方法是使用 IPC,如命名管道/Unix 套接字/Internet 套接字等。但我想避免每个调用者都必须单独打开一个套接字/命名管道,并且每次都进行通信.
简而言之,我想要一个名为 Y 的帮助程序,我可以通过以下方式使用它:

Y set-fps=15
Y show-frame=true
Y get-fps  (should return 15)

我想在 /usr/bin/* 中播放这个帮助程序 Y(或者更确切地说,将它放在 $PATH 目录之一中),以便它可以从命令行执行。

我有哪些选择来获得此功能。我的限制如下:
(i) 程序 X 可以是 C++/Python。
(ii) 多个客户端可以同时调用 Y

我猜这样的系统在 Linux 上很常见,你有像 nmcli 这样的程序与像 network-manager 这样的服务进行交互?

【问题讨论】:

  • 程序 Y 和 X 之间仍然需要某种 IPC 通道。如果您担心多个外部系统或程序同时使用 Y,那么您可以使用某种信号量/互斥系统(大多数操作系统都有命名(系统范围的)信号量)。
  • 这听起来很不愉快。我建议重新考虑设计。
  • 我想要处理多个客户端,命名管道可能太多了(因为我需要为每个尝试连接的客户端提供一对)。我希望能够在有/没有阻塞的情况下同时处理多个客户端(取决于请求)。
  • @EOF:你能详细说明一下吗?这样的设计使任何客户都可以轻松轻松地进行交流。我怎么能做到这一点..
  • UNIX 套接字能否同时且独占地处理多个客户端?

标签: python c++ c sockets named-pipes


【解决方案1】:

抱歉,我还是不能评论。

我可以看到的其中一种方法是:

当您的程序从网络摄像头获取帧时,肯定存在循环或冗余自动。

这样,您可以在一个块中分配内核内存中的一些寄存器,每个寄存器都是参数之一。

然后,在每个循环中,您的 X 程序都可以从该内核空间读取不同的参数。另一方面,每个想要修改参数的客户端也将访问这个内核空间,并修改所需的值。

然后,您必须使用信号量来保护内核空间,以进行任何写入或读取操作。(互斥锁在那里是可以的,但是您可能需要一些写入器/读取器实现)

当然,与对每个参数的保护相比,这在性能上并不是最佳的,但是您只需处理一个信号量,一个简单的互斥体就可以完成这项工作。它当然也没有与管道或套接字的通信那么美观,但是使用它们,您仍然必须保护参数的读取和写入...

【讨论】:

  • 我不能采用这种方法,否则我将不得不一直检查哪些值发生了变化。实际上,我的程序 X 也可能必须将输出返回给程序 Y。所以这行不通。感谢您的评论。
猜你喜欢
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多