2016-03-26 19 views
1

私の子プロセスは動作しません。信号を渡してreadUsual関数を実行する必要があります。

これは小さなコードです:親プロセスからCの子に信号を送信

int main() 
{ 
    pid_t pid2 = fork(); 
    if (pid2 < 0) 
     printf("Can't create child process\n"); 
    else if (pid2==0) 
    { 
     //this block never execute 
     printf("Process2, pid=%d\n",getpid()); 
     signal(SIGUSR1,readUsual); 
    } 
    else 
    { 
     kill(pid2,SIGUSR1); 
     printf("%s\n","Proccess1 end"); 
     for(;;); 
    } 

return 0; 
} 

答えて

3

あなたは何らかの方法で同期を追加したり、fork()signal()を呼び出すためのいずれかが必要です。

あなたの現在のコードでは、子プロセスが信号を受信する前にsignal()を呼び出す方法がありません。それを処理する命令の前にシグナルを受信すると、子プロセスが停止します。

例:このコードの出力の

#include <stdio.h> 

#include <sys/types.h> 
#include <signal.h> 
#include <unistd.h> 

static int received = 0; 

void readUsual(int sig) 
{ 
    if (sig == SIGUSR1) 
    { 
     received = 1; 
    } 
} 

int main() 
{ 
    signal(SIGUSR1,readUsual); 

    pid_t pid2 = fork(); 
    if (pid2 < 0) 
     printf("Can't create child process\n"); 
    else if (pid2==0) 
    { 
     printf("Process2, pid=%d\n",getpid()); 
     while (!received) 
      ; 
     printf("SIGUSR1 received.\n"); 
    } 
    else 
    { 
     kill(pid2,SIGUSR1); 
     printf("%s\n","Proccess1 end"); 
     while (1) 
      ; 
    } 

    return 0; 
} 

例:

Process1 end 
Process2, pid=1397 
SIGUSR1 received 
+0

なたはシグナルハンドラからのprintfなかれ。 – alk

+0

@alk私は知らなかった、現在DuckDuckGoingそれ。 – jdarthenay

+1

afkのコメントを理解するには:http://stackoverflow.com/a/9547988/5845470 – jdarthenay

関連する問題