信号后停止所有的叉子

时间:2017-11-04 20:34:42

标签: c

我有一个程序可以创建两个分叉来按顺序搜索密码。第一个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时,如果不杀死它就无法完成。

我做错了什么?

感谢。

0 个答案:

没有答案