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