0

我在 Linux 下的 C 语言中有一个长时间运行的程序:

长跑.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 的值设置为其他值,以便正在运行的程序将以 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的样本吗?

4

3 回答 3

0

Unix 编程中最基本的思想之一是进程分叉,以及在两个进程之间建立管道。longrun可以先创建一个pipe,调用fork,然后使用父进程作为changemode“监控”进程,而子进程就像你longrun现在使用的那样。您将需要在任一端定期读/写。

谷歌搜索将返回许多示例。这是另一个

于 2013-06-20T19:59:53.553 回答
0

解决方案有两个部分:

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

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

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

于 2013-06-23T05:34:03.650 回答
0

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

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

费尔南多

于 2013-06-21T16:13:06.237 回答