2016-10-09 3 views
0

두 아이 사이의 신호를 100 번 대체 방식으로 보내려고합니다.두 프로세스 사이의 동기화

다음은 제 코드 스 니펫입니다. 여기

는 전체 질문에 대한 링크입니다 : 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()으로 전화하지 않습니다. 또한 두 번째 프로세스의 프로세스 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인지, 그래서 그것의 신호를 전송하는 즉시 반복 시작 의미 (그 자체를 포함하여) 처리 군에서 모든 프로세스에 신호를 보낸다 (just) back to ...

+0

나는이 코드에서 pid2가 0이라고 생각하지 않는다. 두 번째 자식의 pid는 신호 처리기를 통해 검색되고 pid2 전역 변수에 저장된다. –

+0

프로그램 시작시 0으로 초기화됩니다. 처음으로 루프에 들어갔을 때 신호가 수신 된 적이 없으므로 신호 처리기가 아직 실행되지 않았습니다. –