如何从一个程序到另一个长期运行的程序进行通信?

时间:2013-06-20 19:33:58

标签: c linux gcc libc

我在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进行通信 并将mode的值设置为其他值,以便正在运行的程序 以递增顺序显示值。

即,如果我在几分钟后运行程序,它将以这种模式显示:

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

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

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

3 个答案:

答案 0 :(得分:0)

Unix编程中最基本的一个想法是进程分叉,以及在两个进程之间建立管道。 longrun可以首先创建pipe,调用fork,然后使用父进程作为changemode'监控'进程,并使用子进程{{1现在。您需要在两端定期读/写。

谷歌搜索将返回许多examples。这是another

答案 1 :(得分:0)

正如其他答案所述,您需要某种进程间通信。您可以在“Beej指南Unix IPC”(它是“经典”)中找到有关该主题的更多信息,可从以下网址获取:

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

费尔南多

答案 2 :(得分:0)

解决方案分为两部分:

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

  2. sleep替换selectselect将侦听套接字,处理与其他程序的通信。您还可以指定3秒超时,因此当它返回0(表示套接字上没有活动)时,您知道是时候打印一些输出。

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

相关问题