0

LinuxでCで長時間実行されるプログラムがあります:

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 の値を別の値に設定して、実行中のプログラムが 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

他の回答で述べたように、ある種のプロセス間通信が必要です。このトピックの詳細については、「Beej guide to Unix IPC」(「クラシック」です) を参照してください。

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

フェルナンド

于 2013-06-21T16:13:06.237 に答える
0

Unix プログラミングの最も基本的なアイデアの 1 つは、プロセスのフォークと、2 つのプロセス間のパイプの確立です。pipelongrunを作成し、forkを呼び出し、親プロセスを「モニター」プロセスとして使用し、子プロセスを現在使用しているように使用することから始めることができます。いずれかの側で定期的に読み書きする必要があります。changemodelongrun

Google 検索では、多くのが返されます。ここに別のものがあります。

于 2013-06-20T19:59:53.553 に答える
0

このソリューションには、次の 2 つの部分があります。

  1. 2 つのプロセス間の通信チャネル。Unix ドメイン ソケットはそのための優れたツールであり、TCP/IP ソケットと同様に動作します。

  2. に置き換えsleepますselectselectソケットをリッスンし、他のプログラムとの通信を処理します。3 秒のタイムアウトを指定することもできるので、0 (ソケットにアクティビティがないことを意味する) が返されたら、何らかの出力を出力する時間であることがわかります。

#2 の代わりに、2 つのスレッドを使用できます。1 つはスリープして出力を生成し、もう 1 つはソケットを処理します。スレッドによって共有されるデータはすべて同期する必要があることに注意してください (整数が 1 つしかない非常に単純なケースでは、おそらく何も必要ありませんが、より複雑になると必ず必要になります)。

于 2013-06-23T05:34:03.650 に答える