2016-09-20 5 views
0

私は、ユーザー定義シグナルSIGUSR1とSIGUSR2を使用して複数のプロセスが互いに通信する単純なソフトウェアを構築しています。ユーザー定義シグナルsigusr1とsigusr2

私は、以下で説明するようなシナリオで何が起こるか知りたいだけです。

"プロセス1はkillコマンドを使用してプロセス2に送信し、プロセス2は計算を実行するシグナルハンドラを実行しています。プロセス2が完了する前でも、シグナルハンドラプロセス1の実行はsigusr1プロセス-2へ。どうなる何。私はこの1つのために適切な答えを得ることができません。私は2つのシナリオを考える。現在実行中のハンドラは、中断された

  1. ?または
  2. 第2の信号が希望プロセス-2によって無視される。

アドバイスをお願いします。

答えて

1

処理信号には時間がかかり、一度に送信する信号が多すぎると無視されることがあります。あなたは何ができるか

は基本的に言って、他のプロセスに応答信号を送信です:

をねえ、私はあなたの信号を持って、私は

これを準備が整いました私に、次のいずれかを送信信号が無視されることはなく、エラーがなくてもプログラムははるかに高速になります。

あなたが安いソリューションをしたい場合は、単にusleep()と小さな値(実際には、ハードウェアに依存)を使用

ここでは、ASCIIメッセージが信号を使用して別のプロセスに送信される例です。

クライアント - 送信部

void  decimal_conversion(char ascii, int power, int pid) 
{ 
    if (power > 0) 
    decimal_conversion(ascii/2, power - 1, pid); 
    if ((ascii % 2) == 1) 
    kill(pid, SIGUSR1); 
    else 
    kill(pid, SIGUSR2); 
    usleep(1); 
} 

void  ascii_to_binary(char *str, int pid) 
{ 
    int  i; 

    i = 0; 
    while (str[i] != '\0') 
    { 
     decimal_conversion(str[i], 7, pid); 
     i += 1; 
    } 
} 

サーバー

void  sighandler(int signum) 
{ 
    static int ascii = 0; 
    static int power = 0; 

    if (signum == SIGUSR1) 
    ascii += 1 << (7 - power); 
    if ((power += 1) == 8) 
    { 
     putchar(ascii); 
     power = 0; 
     ascii = 0; 
    } 
} 

int  main(void) 
{ 
    signal(SIGUSR1, sighandler); 
    signal(SIGUSR2, sighandler); 
    while (42); 
    return (0); 
} 
1

シグナルを使用してあるプロセスから別のプロセスにテキストを送信することを目標としていました。私が経験したことから、もしprocess-2がその計算を完了するのを待たなければ、process-1によって送られたシグナルは第2のプロセスによって無視され、あなたのメッセージ/データは失われます。

これが起こらないようにするには、process-1からprocess-1にシグナルが送信され、計算が終了し、別のメッセージを送信できることを伝えてください。

+0

なぜパイプを使ってテキストを送信しないのですか? – Garf365

+0

それは学校のためのプロジェクトでしたが、それはそれを行う最も効率的な方法ではありませんが、信号を使用することは必須であり、何も許可されていないことは分かっています。 – D7Heaven

関連する問題