2016-10-09 11 views
0

私は100回の代替方法で2人の子供の間で信号を送信しようとしています。2つのプロセスの間の同期

ここに私のコードスニペットがあります。ここ

は全体の質問へのリンクです: sending signal between two child process

しかし、私は、ループ内の同期の問題を持っています。 ここで、sigsuspend()を配置する正しい位置はどこですか?

#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <ctype.h> 


pid_t pid2; 
struct sigaction act; 

sigset_t mask,oldmask,temp; 

void sighandler(int signum, siginfo_t *info, void *ptr) 
{ 
    printf("Received signal %d\n", signum); 
    printf("Signal originates from process %lu\n", 
     (unsigned long)info->si_pid); 
     pid2 = info->si_pid; 
} 

int main(int argc,char **argv) 
{ 
int i,j,counter = 0,counter2 = 0; 
sigemptyset(&mask); 
sigemptyset(&temp); 
//sigemptyset(&oldmask); 
sigaddset(&mask,SIGUSR1); 

//sigset_t mask; 

    memset(&act, 0, sizeof(act)); 
    act.sa_sigaction = sighandler; 
    act.sa_flags = SA_SIGINFO; 

    if(sigaction(SIGUSR1, &act, NULL) == -1) 
     fprintf(stderr, "sigaction failed: %s\n", strerror(errno)); 


    pid_t current, pidOther; 

    current = getpid(); 
    pidOther = atol(argv[1]); 




int k; 

for(k = 0;k < 100;k++){ 

if(pidOther != 0){ // second child 
    kill(pidOther,SIGUSR1); 
    sigprocmask(SIG_BLOCK,&mask,&oldmask); 
    counter++; 
    printf("2nd child = %d sent signal to 1st child = %d signal number = %d\n",getpid(),pidOther,counter); 
    //sigprocmask(SIG_BLOCK,&mask,&oldmask); 
    sigsuspend(&temp); 
} 


if(pidOther == 0) // fisrt child 
{ 
    //pause(); 
    kill(pid2,SIGUSR1); 
    sigprocmask(SIG_BLOCK,&mask,&oldmask); // was blank 
    counter++; 
    printf("\nj=%d 1st child = %d sent signal to 2nd child = %d signal counter = %d\n",j,getpid(),pid2,counter); 
    printf("test1\n"); 
    sigsuspend(&temp); // was pause() 

    } 

} 

    return 0; 

} 

答えて

0

私はどこにでもfork()と呼ぶことはありません。また、2番目のプロセスのプロセスIDを取ることは、プログラムが子プロセスについて知るべき方法ではありません。ここでは、forkの使い方の簡単な例を示します。

pid_t pid = fork(); 
if (pid == 0) 
{ 
    // executes only in child process.. 
    // do stuff related what you need to do in child process 
} 
else 
{ 
    // executes only in parent process 
    // pid variable contains the child process's PID. 
    // do stuff related what you need to do in parent process 
} 

// runs in both parent and child. 
+0

ここに私の主な質問へのリンクです。私はメインプログラムにフォークを作成しています。 –

+0

http://stackoverflow.com/questions/39858311/sending-signal-between-two-child-process –

+1

@HoseinZarifi:複数の質問にコードを広げないでください。ちょうど[mvce](http ://stackoverflow.com/help/mcve) –

0

問題は、最初の子ループ初めて、pid2が0であるので、それは信号を送信し、直ちにループ開始することを意味し(それ自体を含む)プロセスグループ、内のすべてのプロセスにシグナルを送ります(ちょうど)それ自体に戻る...

+0

私はこのコードではpid2が0であるとは考えていませんが、シグナルハンドラで取得してpid2グローバル変数に格納する2番目の子のPIDです。 –

+0

プログラムの起動時に0に初期化されます。ループの中で最初にシグナルが受信されたことはないので、シグナルハンドラはまだ実行されていません。 –

関連する問題