2016-10-09 1 views
0

Ich versuche, Signale zwischen zwei Kindern auf alternative Weise für 100 Mal zu senden.Synchronisation zwischen zwei Prozess in c

Hier ist mein Codeschnipsel.

hier ist der Link zu der ganzen Frage: sending signal between two child process

Aber ich habe in der Schleife Synchronisierungsproblem. wo ist die richtige Position, um die sigsuspend() zu setzen?

#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; 

} 

Antwort

0

Ich sehe Sie nicht anrufen fork() überall. Auch die Prozess-ID des zweiten Prozesses ist nicht die Art, wie Ihr Programm über den untergeordneten Prozess wissen sollte. Hier ist ein einfaches Beispiel für die Verwendung von 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

hier ist der Link zu meiner Hauptfrage. Ich erstelle eine Gabel im Hauptprogramm. –

+0

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

+1

@HoseinZarifi: Verteilen Sie Ihren Code nicht über mehrere Fragen - stellen Sie einfach eine Frage mit einem [Mvce] (http : //stackoverflow.com/help/mcve) –

0

Das Problem ist, dass das erste Mal, das erste Kind Schleifen, pid2 0 ist, so sendet sie das Signal an jeden Prozeß in der Prozessgruppe (einschließlich sich selbst), das heißt, es beginnt sofort Looping, Signale zu senden (nur) zurück zu sich selbst ...

+0

ich glaube nicht, pid2 ist jemals 0 in diesem code, es ist die pid des zweiten untergeordneten, das durch signal handler abgerufen und in pid2 globale variable gespeichert wird. –

+0

Wird beim Programmstart auf 0 initialisiert. Beim ersten Mal in der Schleife wurde noch nie ein Signal empfangen, daher ist der Signalhandler noch nicht gestartet. –