next up previous
Next: Primitiva write() Up: Descrição de algumas primitivas Previous: Primitiva close()

Primitivas dup() - dup2()

       #include <unistd.h>

       int dup(int oldfd);
       int dup2(int oldfd, int newfd);

Valor de retorno: novo descritor de arquivo ou -1 em caso de erro.

Esta primitiva cria uma cópia de um descritor de arquivo existente (oldfd) e fornece um novo descritor (newfd) tendo exatamente as mesmas características que aquele passado como argumento na chamada. Ela garante que o valor de retorno seja o menor entre todos os valores de descritores possíveis.

dup vai usar o menor número de descritor disponível para criar o novo descritor, enquanto dup2 determina que newfd será a cópia de oldfd, fechando antes newfd se ele já estiver aberto.

Exemplo:

                /* arquivo test_dup.c */

#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
 int fd ;               /* descritor a ser duplicado  */
 int retour1=10 ;       /* valor de retorno de dup  */
 int retour2=10 ;       /* valor de retorno de dup2 */

     if ((fd=open("./fic",O_RDWR|O_CREAT|O_TRUNC,0666))==-1) {
          perror("Error open()") ;
          exit(1) ;
     }
     
     close(0) ;         /* fechamento da saida entrada stdin */

     if ((retour1 = dup(fd)) == -1) {  /* duplicacao */
          perror("Error dup()") ;
          exit(1) ;
     }

     if ((retour2 = dup2(fd,1)) == -1) {  /* duplicacao de stdout */
          perror("Error dup2()") ;
          exit(1) ;
     }   
     
     printf ("valor de retorno de dup()  : %d \n",retour1) ;
     printf ("valor de retorno de dup2() : %d \n",retour2) ;   
     exit(0);
}

Resultado da execução:

euler> test_dup
euler> 
euler> cat fic
valor de retorno de dup()  : 0 
valor de retorno de dup2() : 1

A chamada à primitiva dup() redirige a entrada padrão para o arquivo fic, de descritor fd, e a chamada à dup2() redirige a saída padrão para este mesmo arquivo. O resultado da execução não pode ser desta forma visualizado na tela; deve-se então editar o arquivo fic. Note que a chamada de dup2() não obriga o fechamento do descritor a ser duplicado.



Celso Alberto Saibel Santos 2000-11-14