Enviando señal entre dos procesos hijo.

Creo dos hijos del padre en el progtwig principal. El primer y segundo hijo ejecutan un progtwig (signalSender) después de su creación (junto con el pid del otro hijo como argumento). signalSender tiene manejador de señales y se usa para enviar señales entre procesos. El pid del segundo hijo se da como cero como argumento cuando el primer hijo ejecuta signalShooter. El pid del primer hijo se da como argumento cuando el segundo hijo ejecuta sigShooter.

1) Quiero encontrar el pid del primer hijo a través del controlador de señales después de que el segundo hijo envíe la señal al primer hijo. Intenté guardarlo en la variable global pid_t pid2 pero no funciona.

2) También tengo que enviar la señal entre estos dos niños 100 veces, pero no sé dónde usar la señal ‘para bucle’ y ‘espera’.

The main program: #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  int main() { pid_t pid1,pid2,wid; char *my_args[5]; int aInt = 368 char str[15]; pid1 = fork(); if (pid1 < 0) { fprintf(stderr, ": fork failed: %s\n", strerror(errno)); exit(1); } if(pid1 == 0) { my_args[0] = "sigperf1"; my_args[1] = "0"; my_args[2] = NULL; execv("signalSender",my_args); fprintf(stderr,"signalSender cannot be executed..."); exit(-1); } pid2 = fork(); if(pid2 < 0) { fprintf(stderr, ": fork failed: %s\n", strerror(errno)); exit(1); } if(pid2 == 0) { sprintf(str, "%d", pid1); my_args[0] = "sigperf1"; my_args[1] = str; my_args[2] = NULL; // printf("this is converted = %s\n",my_args[1]); execv(“signalSender",my_args); fprintf(stderr,"signalSender cannot be executed..."); exit(-1); } wid = wait(NULL); } 

El signalSender:

 #include  #include  #include  #include  #include  #include  #include  #include  #include  pid_t pid2; struct sigaction act; 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) { memset(&act, 0, sizeof(act)); act.sa_sigaction = sighandler; act.sa_flags = SA_SIGINFO; sigaction(SIGUSR1, &act, NULL); pid_t current, pidOther; current = getpid(); pidOther = atol(argv[1]); if(pidOther != 0) // we are in the second child { kill(pidOther,SIGUSR1); //sending signal from second child to first } if(pidOther == 0) // we are in the first child { kill(pid2,SIGUSR1); } return 0; } 

Tienes un problema de sincronización aquí.

Ambos procesos secundarios comienzan aproximadamente al mismo tiempo. Así que no puedes predecir cuál kill al otro primero. Si el primer hijo ejecuta kill primero, pasará 0 como el pid que eliminará todos los procesos del grupo de procesos. Además, cada proceso secundario se cierra inmediatamente después de llamar a kill , por lo que uno puede salir antes de que el otro tenga la oportunidad de enviarle una señal.

Necesitas introducir algún tipo de método de sincronización. Una forma sencilla de hacer esto es tener el segundo proceso en sleep brevemente antes de llamar a kill para que el primer proceso tenga la oportunidad de comenzar. De manera similar, el primer proceso debe llamar a pause , lo que le indicará que espere hasta que reciba una señal.

Una vez que haces eso, entonces cada proceso puede hacer una pause y kill en un bucle para ir y venir.

 if(pidOther != 0) // we are in the second child { sleep(1); // wait for first child to start kill(pidOther,SIGUSR1); //sending signal from second child to first for (i=0;i<5;i++) { pause(); kill(pidOther,SIGUSR1); } } if(pidOther == 0) // we are in the first child { pause(); // wait until we get a signal from the second child kill(pid2,SIGUSR1); for (i=0;i<5;i++) { pause(); kill(pid2,SIGUSR1); } }