2013-06-20 35 views
0

我在C长时间运行的程序在Linux下:如何从一个程序与另一个长时间运行的程序进行通信?

longrun.c

#include <stdio.h> 
int main() 
{ 
    int mode=0; 
    int c=0; 
    while(1) 
    { 
     printf("\nrun @ mode %d value : %d ",mode,c); 
     if (c>100) 
      c=0; 
     if(mode==0) 
      c++; 
     else 
      c=c+2; 
     sleep(3); 
    } 
    return 0; 
} 

它会显示

run @ mode 0 value : 0 
run @ mode 0 value : 1 
run @ mode 0 value : 2 

我需要用C写另一个程序(有些东西一样changemode.c ),以便它可以与longrun.c 进行通信并将其模式值设置为某个其他值,以便正在运行的程序将以增量顺序显示值 2.

即,如果我一些x分钟后运行程序,它会在此模式中显示:

run @ mode 0 value : nnn 
run @ mode 0 value : nnn+2 
run @ mode 0 value : (nnn+2)+2 

我可以用文件的方法做到这一点changemode.c将创建一个文件称mode = 2 然后longrun.c将每次打开并检查并继续。还有其他更好的解决方法,比如进程间通信吗?

如果可能的话,任何人都可以写一个changemode.c的样本?

+0

你有没有用Google搜索或看着维基百科[进程间通信(http://en.wikipedia.org/wiki/Inter-process_communication)?有很多方法来完成这个。至于socket通信,我用从http://www.linuxhowtos.org/C_C++/socket.htm几次示例程序。或者,你的文件的建议,坚持,你可以使用[inotify的(http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/index.html)得到一点花哨。请记住其中一些操作的阻塞/非阻塞功能。 – Macattack

+0

你真的不需要写changemod.c可言。只需让当前的pgm打开(非阻塞)一个FIFO。定期读取FIFO(或使用'select'来告诉你何时读取)。另一方面,您可以从命令行写入FIFO。 – Duck

回答

0

Unix编程中最基本的思想之一就是进程分叉和在两个进程之间建立管道。 longrun可以通过创建pipe开始,调用fork,并使用父进程作为changemode“监视”进程,而子进程现在使用longrun。您需要定期读/写任何一端。谷歌搜索将返回很多examples。这里是another

0

正如其他答案中提到的那样,您需要某种进程间通信。您可以找到“Beej指导的Unix IPC”的主题的更多信息(这是一个“经典”),网址:

http://beej.us/guide/bgipc/

费尔南多

0

该方案分为两个部分:

  1. 这两个进程之间的通信通道。 Unix域套接字是一个很好的工具,它们的行为与TCP/IP套接字类似。

  2. select代替sleepselect将侦听套接字,处理与其他程序的通信。你也可以指定一个3秒的超时时间,所以当它返回0(表示在套接字上没有任何活动)时,你就知道该打印一些输出了。

作为#2的替代方案,您可以使用两个线程 - 一个睡眠和生成输出,另一个处理套接字。请注意,线程共享的任何数据应该是同步的(在非常简单的情况下,只有一个整数,您可能不需要任何内容​​,但当它变得更复杂时,您肯定会这样做)。

相关问题