2017-04-15 11 views
0

私は、名前付きパイプ(FIFO)を介してIPC同士でサーバーとクライアントコードを持っています。クライアントはSIGNAL(例えばSIGUSR1)をServerに送り、指定された時間分解能で到着した信号が(コマンドライン引数を介して)到着したかどうかを調べる。サーバは5ms毎に5msをチェックし、5ms後に到着した信号があるかどうかをチェックし、到達していれば何らかのコードを実行し、信号が到着するまで続く。指定された解像度で信号が到着したかどうかを確認する

ここに私の問題があるのです。私はこれらの行動のために何を使うべきかを知らない。私は "Unixシステムプログラミング:コミュニケーション、同時実行性、スレッドKay A. Robbins、Steven Robbins"を見て、私のために使うかもしれない機能をいくつか見つけました。睡眠、アラーム、睡眠、NanoSleep、一時停止。しかし、私は自分の状況でどちらを使うのか分かりません。睡眠は質問から外れています。私は秒がかかると思うし、ミリ秒に変換しようとするとオーバーフローすると思います。

少しのコードスニペットやpsudocodeがわかりやすいです。

信号が所定の解像度の周波数で到着したかどうかを確認する方法を単に尋ねます。私は信号がそれらのミリ秒で到着したかどうか確認しなければならない。信号がキャッチされている場合は、任意の「n」秒をチェックします。

+0

これは不明である - おそらくあなたがシグナルハンドラを登録しましたが、それを超えて、私はあなたが記述しているものを言うことができません。 –

+0

私はシグナルハンドラをはいました。私は2つのタイムサーバーと呼ばれるプログラムを持っている他のクライアントです。タイムサーバーは、シグナルがその引数に到達したかどうかを確認するために、ミリ秒単位でクリックを取得します。 "./timeserver 5"のように5ミリ秒ごとに信号をチェックします。シグナルがある場合、シグナルハンドラはもちろん実行されます。私は基本的に、与えられた "ミリ秒の引数"のブロックとアンブロックを行いたい。 – opricnik

+0

あなたはブロックしたりアンブロックしたりしたくない。シグナルが到着した場合、シグナルハンドラにフラグを設定させたいとします。 – AlexP

答えて

0

機能nanosleep(とusleep)も機能すると思います!

  1. あなたがループにあなたが持っているプログラムによってcatchedすることができ、所望の信号、例えば:

    #include <signal.h> 
    /* Handler for the signals */ 
    void my_handler(int signum) 
    { 
        if(signum == SIGUSR1) { 
        /* Perform an action on signal SIGUSR1*/ 
        } 
    } 
    int main(int argc, char * argv[]){ 
        /* .... */ 
        /* Install the signal handler to catch the desired signals*/ 
        signal(SIGUSR1, my_handler); 
        /* .... */ 
    } 
    
  2. のためのシグナルハンドラをインストールして、信号を待つ必要があります。シグナルをキャッチした場合は、ハンドラ内でアクションを実行するか、nanosleepが中断されたときに発生する例外を使用する必要があります。

    #include <time.h> /* Contains nanosleep + timespec definition */ 
    #include <errno.h> /* Contains the errno variable and the ERROR_CODE macros */ 
    #include <stdio.h> /* Contains definition of perror */ 
    #include <stdlib.h> /* Contains the exit function */ 
    
    int main(int argc, char * argv[]){ 
        /* fetch milliseconds from argv and put in a variable named "ms" */ 
        struct timespec interval; 
        interval.tv_sec = 0; /* Seconds*/ 
        interval.tv_nsec = ms*1e6; /* 10^6 Nanoseconds = 1 millisecond */ 
        struct timespec interrupted; 
        /* .. */ 
        while(1) { 
         if(nanosleep(&interval, &interrupted) != 0){ 
          /* The sleeping was interrupted! */ 
          if(errno == EINTR){ 
           //The interruption is due to a signal 
          } 
          else { 
           /*The interruption is due to another cause (read the man page) --> Print an error message */ 
           perror("Nanosleep"); 
           break; /* Exit from main loop */ 
          } 
        } 
        return EXIT_FAILURE; 
        } 
    

代わりに、あなたはまた、ハンドラ内の信号を扱うことができます。

代替ソリューション あなたは、信号が今まで来ると確信していますし、あなたも機能pauseを使用することができ、それぞれ5ミリ秒を制御する必要がない場合。実際にはmanページは言う:

ポーズ信号 は、いずれかのプロセスを終了するか、信号を引く機能の 呼び出しを引き起こすことが配信されるまで、呼び出しプロセス(またはスレッド)がスリープ状態になります。

この場合、シグナルハンドラをインストールして待機するだけです。

あなたの質問に答えたかどうか教えてください。

Sincerlyあなた、 ミルコ

+0

ループソリューションが私のために働いてくれてありがとう。私はそれが%100が私に愚かな方法を使用しなければならない信号を与えることを知っているが、彼らがdesign.kudos – opricnik

関連する問題