#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.