L'utility dup
e le sue varianti (dup2
, dup3
) sono chiamate di sistema (system calls) nei sistemi operativi Unix e Linux che servono a duplicare un descrittore di file esistente. Un descrittore di file è un intero non negativo che rappresenta una risorsa aperta (come un file, una pipe, un socket, ecc.) all'interno del kernel. Duplicare un descrittore di file significa creare un nuovo descrittore di file che si riferisce alla stessa risorsa sottostante.
Funzionamento:
dup(oldfd)
: Crea un nuovo descrittore di file che è una copia di oldfd
. Il nuovo descrittore di file utilizza il numero di descrittore di file più basso disponibile. Entrambi i descrittori (oldfd
e il nuovo) si riferiscono alla stessa risorsa. Condividono lo stesso offset di file (puntatore alla posizione corrente all'interno del file).
dup2(oldfd, newfd)
: Duplica oldfd
al descrittore di file newfd
. Se newfd
è già aperto, viene prima chiuso automaticamente. Poi, newfd
viene reso una copia di oldfd
, condividendo la stessa risorsa e lo stesso offset di file.
dup3(oldfd, newfd, flags)
: Simile a dup2
, ma aggiunge la possibilità di specificare dei flags
per controllare il comportamento della duplicazione. Questo rende possibile duplicare un file descriptor in modo atomico e con opzioni aggiuntive.
Importanza:
Redirezione di Input/Output: dup2
è particolarmente utile per la redirezione di input/output. Ad esempio, si può reindirizzare l'output standard (stdout, descrittore di file 1) di un programma verso un file specifico.
Creazione di Pipeline: Le pipeline utilizzano dup
e dup2
per collegare l'output di un processo all'input di un altro.
Processi Figlio (Fork): Dopo una chiamata a fork
, sia il processo padre che il processo figlio hanno copie degli stessi descrittori di file. L'uso di dup
e dup2
consente a ciascun processo di manipolare questi descrittori in modo indipendente.
Concorrenza: dup3
con flag appositi permette di duplicare un file descriptor in modo atomico, il che è importante in scenari di concorrenza per evitare race condition.
Esempio (Redirezione Output):
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
perror("open");
return 1;
}
// Duplica il descrittore del file nel descrittore 1 (stdout)
if (dup2(fd, 1) == -1) {
perror("dup2");
close(fd);
return 1;
}
close(fd); // Chiudi il descrittore originale (non è più necessario)
printf("Questo testo verrà scritto nel file output.txt\n");
return 0;
}
Nell'esempio sopra, dup2(fd, 1)
fa sì che qualsiasi cosa venga stampata su stdout (descrittore di file 1) venga effettivamente scritta nel file "output.txt". La system call close(fd)
è importante perché il descrittore fd
non è più necessario, e chiuderlo rilascia la risorsa.
Ne Demek sitesindeki bilgiler kullanıcılar vasıtasıyla veya otomatik oluşturulmuştur. Buradaki bilgilerin doğru olduğu garanti edilmez. Düzeltilmesi gereken bilgi olduğunu düşünüyorsanız bizimle iletişime geçiniz. Her türlü görüş, destek ve önerileriniz için iletisim@nedemek.page