1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

pipes

Discussão em 'Programação' iniciada por askno, 6 de Julho de 2008. (Respostas: 6; Visualizações: 760)

  1. askno

    askno Power Member

    A primeira função está a funcionar perfeitamente,
    cifra.exe é um programa que lê do teclado e retorna a frase cifrada para o monitor.

    Na segunda função pretendo aplicar o cifra.exe 3 vezes a mesma frase e apenas me imprime 1 vez a frase depois de cifrada se alguem me souber explicar pk?
    Obrigado abraços
    Código:
     
     
    int versaoUmPrograma () {
    pipe(fd);
    if (fork() == 0) {
    close(fd[1]); 
    dup2(fd[0], STDIN_FILENO); 
    execlp("cifra.exe", NULL);
    } 
    else { 
    close(fd[0]); 
    read (STDIN_FILENO, frase, 50);
    write (fd[1], frase, 50);
    }
    return 0;
    }
     
     
    int maisQueUmPrograma () {
    read (STDIN_FILENO, frase, 50);
    int i;
    for (i = 0; i < 3; i++) {
    pipe(fd);
    if (fork() == 0) {
    close(fd[1]); 
    dup2(fd[0], STDIN_FILENO); 
    execlp("cifra.exe", NULL);
    exit (1);
    } 
    else {
    close (fd[0]);
    write (fd[1], frase, 50);
    wait (0);
    }
    }
    }
    
     
  2. countzero

    countzero Power Member

    Olá.

    O código parece estar correcto...

    Estás a correr isso em algum ambiente que tenha limite máximo de processos simultâneos? Qual é o SO?

    Cumps,
    JP
     
  3. askno

    askno Power Member

    Tou a usar cygwin em windows, neps nao tenho limites ja exprimentei a bomba de forks e so rebotando.. mas exprimentaste a segunda função? tipo ele funciona so nao me imprime é tres vezes a frase codificada! Apenas me imprime 1 e dp a consola fika um pouco eskesita so dando enter e ke ja fika normal
     
  4. countzero

    countzero Power Member

    Em Linux, colocando a tua segunda função a chamar um executável "cifra" - que chama o crypt(3) com o texto recebido no stdin - o resultado é o seguinte:
    Código:
    $ ./code
    Isto é um teste.
    
    plaintext: Isto é um teste.
    ciphertext: $1$42$xWCUY0bdXdMzoSs12aiKK.
    
    plaintext: Isto é um teste.
    ciphertext: $1$42$xWCUY0bdXdMzoSs12aiKK.
    
    plaintext: Isto é um teste.
    ciphertext: $1$42$xWCUY0bdXdMzoSs12aiKK.
    $
    
    Cumps,
    JP
     
    Última edição: 7 de Julho de 2008
  5. nasic

    nasic Power Member

    Besta Ratolancio!!

    Tá visto que é do fork. Não funca em ambiente win.

    EDIT: mas deveria funcionar na cygwin. Tens que usar forks?pq não usas threads?

    Abraço ratolas
     
    Última edição: 7 de Julho de 2008
  6. limas123

    limas123 Power Member


    Concordo contigo, porque não usar threads? Não tenho a certeza mas julgo que a função para criar processos "filhos" fork não tem esse nome para as bibliotecas do windows...
     
  7. askno

    askno Power Member

    Boas obrigado pelos esclarecimentos, nao tou a usar threads pk nao sai po exame :P pois eu dp exprimento em linux então pk o codigo realmente parecia estar certo! Besta tetra abraço!!
     

Partilhar esta Página