我有一个程序可以创建两个分叉来按顺序搜索密码。第一个fork从头到尾搜索,第二个fork从中间到结束。
void handler(int sig)
{
if (sig == SIGUSR1)
{
printf("[H] [%d] recibe la señal SIGUSR1\n", getpid());
exit(0);
}
}
void handler_padre(int sig) {
if (sig == SIGUSR1)
{
printf("[P] [%d] recibe la señal SIGUSR1\n", getpid());
exit(0);
}
}
int main ( int argc, char * argv [ ] )
{
char * claveCifrada = argv[1] ;
char * pwd_0 = argv[2] ;
char * pwd_1 = argv[3] ;
int verbose ;
int pid, pid_1, pid_2 ;
char pwdMedio [6] ;
int estado ;
trataSenial.sa_handler = handler_padre ;
sigaction(SIGUSR1, &trataSenial, NULL) ;
int resultado = analizarArgumentos(argc, argv, &verbose) ;
if (resultado != 0) return(resultado) ;
strcpy(pwdMedio, pwd_0) ;
obtenPwd((valor(pwd_0)+valor(pwd_1))/2, (char *)&pwdMedio) ;
printf("pwdMedio = \"%s\"\n\n", pwdMedio) ;
printf("[P] [%d] iniciado\n", getpid());
/* ver: setsid, kill(0, _) */
if ((pid_1 = fork()) == 0) {
signal(SIGUSR1, handler);
resultado =
buscaEImprimeClave(claveCifrada, pwd_0, pwdMedio, 0, getppid()) ;
return(resultado) ;
}
if ((pid_2 = fork()) == 0) {
signal(SIGUSR1, handler);
siguientePassword(pwdMedio) ;
resultado =
buscaEImprimeClave(claveCifrada, pwdMedio, pwd_1, 0, pid_1) ;
return(resultado) ;
}
waitpid(pid_1, &estado, 0) ;
waitpid(pid_2, &estado, 0) ;
/*pid = wait((int *)&estado) ;
pid = wait((int *)&estado) ;*/
printf("\n fin del proceso padre\n\n") ;
return(0) ;
}
发送我使用的信号:
/*
In the first fork, pidOtro == getppid()
In the second fork, pidOtro == pid_1
*/
kill(-pidOtro, SIGUSR1);
程序结束很好,结束了两个分叉,但是当执行time ./program
时,如果不杀死它就无法完成。
我做错了什么?
感谢。