A função dup2 em C

Jinku Hu 12 outubro 2023
  1. Use a função dup2 para duplicar um descritor de arquivo em C
  2. Use a função dup para duplicar um descritor de arquivo em C
A função dup2 em C

Este artigo irá explicar vários métodos de como usar a função dup2 em C.

Use a função dup2 para duplicar um descritor de arquivo em C

Os arquivos são geralmente manipulados após serem abertos usando a chamada de sistema open. Em caso de sucesso, open retorna um novo descritor de arquivo associado ao arquivo recém-aberto. Em sistemas baseados em Unix, o sistema operacional mantém uma lista de arquivos abertos para cada programa em execução, chamada de tabela de arquivos. Cada entrada é representada usando o inteiro do tipo int. Esses inteiros são chamados de descritores de arquivo nesses sistemas, e muitas chamadas de sistema tomam os valores do descritor de arquivo como parâmetros.

Cada programa em execução tem três descritores de arquivo abertos por padrão quando o processo é criado, a menos que eles optem por fechá-los explicitamente. A função dup2 cria uma cópia do descritor de arquivo fornecido e atribui um novo inteiro a ele. dup2 usa um descritor de arquivo antigo para ser clonado como o primeiro parâmetro e o segundo parâmetro é o inteiro para um novo descritor de arquivo. Como resultado, esses dois descritores de arquivo apontam para o mesmo arquivo e podem ser usados de forma intercambiável. Observe que se o usuário especificar um inteiro usado atualmente pelo arquivo aberto como o segundo parâmetro, ele será fechado e reutilizado como o descritor de arquivo clonado.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

extern int counter;

int main(void) {
  int fd = open("tmp.txt", O_WRONLY | O_APPEND);

  printf("tmp.txt fd = %d\n", fd);
  dup2(fd, 121);
  dprintf(121, "This string will be printed in tmp.txt file\n");

  exit(EXIT_SUCCESS);
}

Resultado:

tmp.txt fd = 3

O exemplo acima demonstra o uso básico da função dup2, onde um arquivo arbitrário denominado tmp.txt é aberto no modo append e algum texto formatado é gravado nele. O descritor de arquivo padrão é 3 retornado da chamada de sistema open. Depois de executar a chamada de função dup2 com o segundo argumento de 121, o mesmo arquivo pode ser endereçado usando o novo descritor de arquivo. Conseqüentemente, chamamos a função dprintf, que é semelhante à função printf, exceto que leva um argumento descritor de arquivo adicional especificando o destino para escrever a saída.

Use a função dup para duplicar um descritor de arquivo em C

Alternativamente, outra função chamada dup faz a clonagem do descritor de arquivo semelhante a dup2. No entanto, a função dup leva um único argumento do descritor de arquivo a ser copiado e retorna o recém-criado automaticamente. O exemplo a seguir demonstra o uso dup, onde armazenamos o valor retornado em um tipo int e, em seguida, passamos a função dprintf para o descritor de arquivo recuperado. Observe que o usuário é responsável por implementar as rotinas de verificação de erros para ambas as funções para verificar a execução bem-sucedida. Consulte a página de manual dup/dup2 para obter os detalhes específicos aqui.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

extern int counter;

int main(void) {
  int fd = open("tmp2.txt", O_WRONLY | O_APPEND);

  printf("tmp2.txt fd = %d\n", fd);
  int dup_fd = dup(fd);
  dprintf(dup_fd, "This string will be printed in tmp2.txt file\n");

  exit(EXIT_SUCCESS);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C File