当我通过控制台运行应用程序时,例如$application start
,我该如何与所述应用程序通信?所以我可以例如做$application load --/home/application/files/file.txt --warn=0 --notice=0
并且运行的应用程序实例会对此作出反应......
我不想继续在应用程序端监听控制台。我希望能够关闭控制台,重新打开它,并仍然与程序进行交互。
我这样做的原因是因为我想要一个主程序加载它在后台执行的不同操作。我希望能够添加运算符,并删除操作。
我自己有一些PHP的经验,我知道Apache有这样的行为。
编辑:经过一些评论,我得出结论,我需要使用IPC。我之前听说过这个,但我从来没有真正理解它是如何工作的。经过一些谷歌搜索和WikiPedia链接,你告诉我,我得出的结论是,有一些处理IPC的方法。我想将数据包发送到主进程,哪一个在我的情况下是最好的?我个人最喜欢的atm是一个消息队列,但它似乎只在同一个进程中工作。
答案 0 :(得分:1)
由于@LokiAstari指出,您可能对C ++没有太多经验,我建议您阅读:How to parse command line parameters。
然后我会使用/tmp
中的临时文件与主程序通信,主程序运行无限循环,等待对临时文件的修改。
答案 1 :(得分:1)
能够在后台运行应用程序并能够关闭启动时的控制台,您可以使用nohup
实用程序。那么你应用程序的第一个实例应该创建一些(“众所周知的”)IPC资源(消息队列,FIFO,无论如何),因此更多实例将通过它与第一个实例进行通信。
并且相对容易,然后将应用程序转换为功能齐全的守护程序。
答案 2 :(得分:0)
我个人会在多个阶段这样做 否则,您将尝试同时解决许多不同的问题。
您正在做的是编写服务(长期运行的应用程序)。通过运行命令与服务进行通信通常涉及运行与服务通信的不同应用程序(在apache情况下,apache命令启动httpd
服务。然后后续命令与httpd
服务通信。
但要想实现这一目标,首先要完成几个步骤会更容易。
编写一个应用程序,在启动时从目录中读取命令 :所以在启动时你有一个命令目录 :您打开每个文件(按顺序执行文件),然后重命名该文件以显示文件已完成。
修改您的应用程序以作为连续循环运行。
所有循环都是在作业队列中查找事件
:如果它看到他们执行工作。
:如果那里没有工作,那就睡10秒钟
:在启动时你只需注入一份工作
- > :它读取命令目录并为每个文件创建作业
- > :文件作业执行文件,然后重命名文件以显示文件已完成。
修改您的服务以使用线程 :在一个线程中运行事件循环 :使用锁和信号量,以便向队列添加的项是线程安全的 :当应用程序启动时,你启动事件循环(确保它开始然后注入作业(如2)。然后等待事件循环完成(它不会)。
添加一个触发十秒钟的计时器线程来检查命令目录
:所有计时器应该创建一个作业并将其放入事件队列中
:现在你不需要在启动时注入一个工作作为计时器的工作。
完成上述所有操作后,您就可以开始介绍一个侦听器,该侦听器将在套接字上侦听来自其他应用程序的间接命令。
:一次性执行上述所有操作对于初学者来说将是一个很长的错误。我建议你通过上面的所有步骤来进入这个状态,然后再问一个关于如何做IPC的问题
:所以添加一个侦听套接字的新线程(好吧,这不是最好的技术,但这是引导初学者)。当它接收到输入时,它会在命令目录中创建一个文件,然后将作业放入作业队列中。
您现在应该可以使用命令行curl
(或wget
命令)测试命令,以便将文件发送到您的服务。
一旦您使用curl
您可以编写一个独立的应用程序,将命令行参数转换为命令文件并将其发送到您的服务。
将您的应用程序从使用文件转换为在作业对象中包含所有信息。
多数民众赞成。