0

例如,当我通过控制台运行应用程序时$application start,如何与该应用程序通信?所以我可以做$application load --/home/application/files/file.txt --warn=0 --notice=0,并且应用程序的运行实例会对此做出反应......

我不想继续在应用程序端收听控制台。我希望能够关闭控制台,重新打开它,并且仍然与程序交互。

我这样做的原因是因为我想要一个主程序来加载它在后台执行的不同操作。我希望能够添加操作员和删除操作。

我自己对 PHP 有一些经验,我知道 Apache 有这样的行为。

编辑:经过你们的一些评论,我得出结论,我需要使用 IPC。我以前听说过这个,但我从来没有真正理解它是如何工作的。经过一些谷歌搜索和您向我展示的 WikiPedia 链接后,我得出结论,有很多处理 IPC 的方法。我想将数据包发送到主进程,在我的情况下哪一个是最好的?我个人最喜欢的 atm 是一个消息队列,但它似乎只能在同一个进程中工作。

4

3 回答 3

1

由于@LokiAstari 指出,您可能对 C++ 没有太多经验,因此我建议您阅读:如何解析命令行参数

然后我会使用一个临时文件/tmp与主程序通信,主程序运行一个无限循环,等待对临时文件的修改。

于 2013-08-04T17:13:21.140 回答
1

为了能够在后台运行应用程序并能够关闭启动它的控制台,您可以使用nohup实用程序。那么您的应用程序的第一个实例应该创建一些(“众所周知的”)IPC 资源(消息队列、FIFO 等),因此其他实例将通过它与第一个实例进行通信。

并且相对容易,然后将您的应用程序变成一个功能齐全的守护程序

于 2013-08-04T17:20:01.313 回答
0

就我个人而言,我会分多个阶段执行此操作。
否则,您将尝试一次解决许多不同的问题。

您正在做的是编写服务(一个长时间运行的应用程序)。通过运行命令与服务通信通常涉及运行与服务对话的不同应用程序(在 apache 的情况下,apache 命令启动httpd服务。然后后续命令与httpd服务对话)。

但是要启动并运行它,首先要完成几个步骤会更容易。

  1. 编写一个在启动时从目录读取命令的应用程序
    :所以在启动时你有一个命令目录。
    :您打开每个文件(如果文件有效,则执行该文件)然后重命名文件以表明它已完成。

  2. 修改您的应用程序以作为连续循环运行。循环所做的只是在作业队列中查找事件。
    :如果它看到他们执行作业。
    :如果那里没有工作,则休眠 10 秒。
    :在启动时,您只需注入一个作业
    -> :它读取命令目录并为每个文件创建一个作业。
    -> :文件作业执行文件然后重命名文件以显示它已完成。

  3. 修改您的服务以使用线程。
    :在一个线程中运行事件循环。
    :使用锁和信号量,以便添加到队列中的项目是线程安全的。
    :当应用程序启动时,您启动事件循环(确保它启动然后注入作业(如 2 所示)。然后等待事件循环完成(它不会)。

  4. 添加一个每隔 10 秒触发一次的计时器线程来检查命令目录
    :计时器应该做的就是创建一个作业并将其放入事件队列中。
    :现在您不需要在启动时注入作业它的计时器作业。

  5. 运行完上述所有操作后,您就可以引入一个侦听器,该侦听器将在套接字上侦听来自另一个应用程序的间接命令。
    :一次性完成以上所有操作以运行服务对于初学者来说很容易出错。我建议您完成上述所有步骤以达到此状态,然后再询问有关如何进行 IPC 的另一个问题。
    :所以添加一个监听套接字的新线程(好吧,这不是最好的技术,但这是引导初学者)。当它接收到输入时,它会在命令目录中创建一个文件,然后将一个作业放入作业队列中。

  6. 您现在应该能够使用命令行curl(或wget命令)将文件发送到您的服务来测试您的命令。

  7. 一旦你让它与curl.
    您可以编写一个独立的应用程序,将命令行参数转换为命令文件并将它们发送到您的服务。

  8. 将您的应用程序从使用文件转换为在作业对象中包含所有信息。

  9. 就是这样。

于 2013-08-04T17:29:09.410 回答