调用相同的程序实例?

时间:2010-10-22 10:57:35

标签: c linux

我正在创建一个在发生特定事件时从shell脚本调用的C程序。 C程序从shell脚本获取一个参数,如下所示:

> ./c-program.bin HELLO

现在C程序正在运行,直到它收到特定字符作为参数。问题是,如果发生第二个事件,现在调用C程序:

./c-program.bin WORLD

然后它是一个启动的程序的新实例,它对第一个事件中的字符串一无所知。我想要实现的是这样的:

[EVENT0] ./c-program.bin HELLO
[EVENT1] ./c-program.bin WORLD
[EVENT2] ./c-program.bin *

c-program输出:

HELLO WORLD

关于如何只有一个程序实例的任何想法?该平台是Linux。因此,该项目正处于计划中,至今我没有任何具体的代码,我试图首先解决不同的问题。

5 个答案:

答案 0 :(得分:1)

您需要一个中间应用程序,或者可能需要一个单独的shell脚本

中间脚本会将参数缓存到磁盘,直到您传递'*',然后它会将整个缓存的字符串传递给最终的c程序。

所以你的第一个脚本将调用第二个脚本,传递:

secondscript HELLO
secondscript WORLD
secondscript *

当第二个脚本收到参数*时,它会将所有先前的参数传递给您的c程序

./c-program.bin HELLO WORLD

与后来的答案相比,这似乎仍然是最简单的选择。你可以在10分钟内编写脚本。中间应用程序/脚本的伪代码:

passedstring = args[0]

if passedstring = "*"
    string cache = readcontents(cachefile)
    call c program passing cache
    clearcontents(cachefile)
else
    append(cachefile, passedstring)   

如果您想要开发一个可以在内存中检查其自身的另一个版本的花哨的dancin应用程序的挑战,那么在套接字中传递东西,去吧:)

答案 1 :(得分:1)

概括地说,你有一个神奇的“输出所有”参数,并希望在多个调用之间累积所有其他参数,直到你得到神奇的请求?很容易,但需要一些共享状态。第一个hack会把那个状态放在文件系统中(数据库会更好,但更复杂)。

答案 2 :(得分:1)

我会使用存储在某处的pid文件。 如果您启动该程序,它应该不确定另一个程序没有运行(使用pid文件+验证)。如果没有,创建一个他将读取数据的命名管道。然后把它放在后台,感谢子进程(fork)。

然后启动另一个实例,找到pidfile并检测实例已经启动。第二个程序会将argv [i]发送到命名管道,因此第一个实例应该打印数据。

另一个想法是在给定文件中使用unix套接字,例如mysql.sock。

答案 3 :(得分:1)

您的程序应检查另一个实例是否正在运行,如果是这种情况,则将其参数传递给该实例,然后退出。活着的第一个实例应该成为“服务器”,即准备接收数据。您可以使用共享内存或管道在进程之间传递数据。

答案 4 :(得分:1)

你想要的不是很清楚。我认为你正在经历一个长期运行的过程,累积某种“消息”,然后允许检索这些消息。

这是一个可能的解决方案:

  1. 尝试在已知位置创建fifo。如果成功,请派一个监听该fifo的守护进程,累积消息直到收到*,此时它会将所有消息发送回fifo,包括*
  2. 原始进程(无论是否生成守护进程)打开fifo进行写入,然后按下该消息。
  3. 如果参数为*,则会读取fifo并输出所有内容,直到收到回显的*