9

I have this program, we'll call it Host. Host does all kinds of good stuff, but it needs to be able to accept input through the command line while it's running. This means it has to somehow send its other process data and then quit. For example, I need to be able to do this:

./Host --blahblah 3 6 3 5

This should somehow end up calling some function in Host called

handleBlahBlah(int x1, int y1, int x2, int y2){
  //do some more sweet stuff
}

Host is a C program, and does not need to support multiple instances.

An example of this is Amarok music player. With Amarok running and playing, you can type "amarok --pause" and it will pause the music.

I need to be able to do this in Linux or Windows. Preferably Linux.

What is the cleanest way to implement this?

4

6 回答 6

10

如果您在 Windows 上,我会告诉您使用隐藏窗口来接收消息,但是由于您使用./,我假设您想要基于 Unix 的东西。

在这种情况下,我会使用命名管道。Sun 有一个关于命名管道的教程,可能很有用。

该程序可能会创建管道并收听。您可以有一个单独的命令行脚本来打开管道并将其命令行参数回显给它。

可以修改程序以支持命令行发送,而不是使用单独的脚本。在这种情况下,你会做同样的基本事情。您的程序将查看它的命令行参数,如果适用,打开通往程序“主”实例的管道,并发送参数。

于 2008-08-13T22:49:13.653 回答
6

如果它需要跨平台,您可能需要考虑让正在运行的实例侦听 TCP 端口,并让您从命令行启动的实例向该端口发送消息。

于 2008-08-13T22:51:30.453 回答
4

我建议使用Unix 套接字D-Bus。如果您熟悉 Unix 套接字编程并且只需要一些操作,那么使用套接字可能会更快,而 D-Bus 可能更容易专注于以熟悉的面向对象方式实现功能。

看看Beej 的 Unix IPC 指南,尤其是关于Unix 套接字的章节。

于 2008-08-18T08:55:41.417 回答
1

没有人在这里说过的是:“你不能从这里到达那里”。

命令行仅在调用程序时可用。

一旦fillinthename运行,调用“ fillinthename arguments ...”与fillinthename通信的例子只能通过使用相互通信的程序的两个实例来完成。

其他答案提出了实现沟通的方法。

一个类似于amarok的程序需要检测它自己的另一个实例的存在,以便知道它必须扮演哪个角色,持久消息接收器/服务器的主要角色,或者一次消息发送者的次要角色。

编辑以使单词 fillinthename 实际显示。

于 2010-06-07T14:47:50.567 回答
0

我见过的一种技术是让你的Host程序仅仅是你真正程序的“外壳”。例如,当您正常启动应用程序时(例如:)./Host,程序将分叉到代码的“主应用程序”部分。当您以一种建议您希望向正在运行的实例发出信号的方式启动程序时(例如:)./Host --send-message restart,该程序将分叉到代码的“消息发送者”部分。这就像将两个应用程序合二为一。另一个不使用的选项forkHost纯粹制作一个“消息发送者”应用程序,并将您的“主应用程序”作为一个单独的可执行文件(例如:)Host_coreHost可以单独启动。

程序的“主应用程序”部分需要打开某种通信通道来接收消息,而“消息发送者”部分需要连接到该通道并使用它来发送消息。有几种不同的选项可用于在进程之间发送消息。一些更常见的方法是管道套接字。根据您的操作系统,您可能有其他可用选项;例如,QNX 有频道,BeOS/Haiku 有BMessages。您也许还可以找到一个巧妙地封装了此功能的库,例如lcm

于 2010-08-11T17:32:45.453 回答
-2

So, I may be missing the point here, but by deafult a C program's main function takes two arguments; argc, a count of the number of arguments (at least one), and argv (or arg vector), the argument list. You could just parse through the arguments and call the correct method. For example:

 int main(int argc, *argv[])
 {
     /*loop through each argument and take action*/
      while (--argc > 0)
      {
           printf(%s%s, *++argv, (argc > 1) ? " " : "");
      }
 } 

would print all of the arguments to screen. I am no C guru, so I hope I haven't made any mistakes.

EDIT: Ok, he was after something else, but it wasn't really clear before the question was edited. Don't have to jump on my rep...

于 2008-08-13T22:43:34.367 回答