La funzione dup2 in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione dup2 per duplicare un descrittore di file in C
  2. Usa la funzione dup per duplicare un descrittore di file in C
La funzione dup2 in C

Questo articolo spiegherà diversi metodi su come utilizzare la funzione dup2 in C.

Usa la funzione dup2 per duplicare un descrittore di file in C

I file vengono solitamente manipolati dopo essere stati aperti utilizzando la chiamata di sistema open. In caso di successo, open restituisce un nuovo descrittore di file associato al file appena aperto. Nei sistemi basati su Unix, il sistema operativo mantiene una lista di file aperti per ogni programma in esecuzione, chiamato tabella di file. Ogni voce è rappresentata utilizzando il tipo intero int. Questi numeri interi sono chiamati descrittori di file in questi sistemi e molte chiamate di sistema accettano i valori dei descrittori di file come parametri.

Ogni programma in esecuzione ha tre descrittori di file aperti per impostazione predefinita quando il processo viene creato, a meno che non scelgano di chiuderli esplicitamente. La funzione dup2 crea una copia del descrittore di file specificato e gli assegna un nuovo numero intero. dup2 accetta un vecchio descrittore di file da clonare come primo parametro e il secondo parametro è il numero intero per un nuovo descrittore di file. Di conseguenza, entrambi questi descrittori di file puntano allo stesso file e possono essere utilizzati in modo intercambiabile. Si noti che se l’utente specifica un numero intero attualmente utilizzato dal file aperto come secondo parametro, verrà chiuso e quindi riutilizzato come descrittore di file clonato.

#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);
}

Produzione:

tmp.txt fd = 3

L’esempio sopra mostra l’uso di base della funzione dup2, dove un file arbitrario chiamato tmp.txt viene aperto in modalità append e vi viene scritto del testo formattato. Il descrittore di file predefinito è 3 restituito dalla chiamata di sistema open. Dopo aver eseguito la chiamata alla funzione dup2 con il secondo argomento di 121, lo stesso file può essere indirizzato usando il nuovo descrittore di file. Di conseguenza, chiamiamo la funzione dprintf, che è simile alla funzione printf tranne per il fatto che richiede un ulteriore argomento descrittore di file che specifica la destinazione per la scrittura dell’output.

Usa la funzione dup per duplicare un descrittore di file in C

In alternativa, un’altra funzione chiamata dup esegue la clonazione del descrittore di file in modo simile a dup2. Tuttavia, la funzione dup accetta un singolo argomento del descrittore di file da copiare e restituisce automaticamente quello appena creato. L’esempio seguente mostra l’utilizzo di dup, dove memorizziamo il valore restituito in un tipo int e poi passiamo la funzione dprintf al descrittore di file recuperato. Notare che l’utente è responsabile dell’implementazione delle routine di controllo degli errori per entrambe le funzioni per verificare la corretta esecuzione. Vedere la pagina di manuale dup/dup2 per i dettagli specifici qui.

#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);
}
Autore: 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

Articolo correlato - C File