如何通过控制台/C++与程序通信



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 就是这样。

最新更新