C Programmazione

dup2 Chiamata di sistema in Do

dup2 Chiamata di sistema in Do
Il dup2() la funzione di sistema viene utilizzata per creare una copia di un descrittore di file esistente. In Linux, ci sono 3 descrittori di file standard. Sono:

standard: Questo è il descrittore di file di input standard. Viene utilizzato per ricevere input dal terminale per impostazione predefinita. scanf(), getc() ecc funzioni usi standard descrittore di file per accettare gli input dell'utente. Il standard anche il descrittore di file è rappresentato dal numero 0.

stdout: Questo è il descrittore di file di output standard. Viene utilizzato per stampare qualcosa sulla console/terminale per impostazione predefinita. Il ampiamente usato printf() la funzione usa stdout per stampare l'output desiderato sulla console/terminale. Il stdout anche il descrittore di file è rappresentato dal numero 1.

stderr: Questo è il descrittore di file di errore standard. Fa la stessa cosa del stdout descrittore di file. Il stderr il descrittore di file viene utilizzato per stampare i messaggi di errore sulla console/terminale. L'unica differenza è se usi stderr descrittore di file per stampare i messaggi di errore e stdout descrittore di file per stampare output normali, quindi è possibile separarli in seguito. Ad esempio, puoi reindirizzare i messaggi di errore su un file e i normali output sulla console o su un altro file. Il stderr anche il descrittore di file è rappresentato dal numero 2.

Oltre a questi 3 descrittori di file, puoi creare descrittori di file aggiuntivi in ​​C. Per creare un nuovo descrittore di file, puoi usare il Aperto() funzione in Do. Il Aperto() la funzione apre un nuovo file, crea un descrittore di file per quel file e allega un numero diverso da 0, 1, 2 al descrittore di file.

Una volta aperto un file utilizzando Aperto() funzione, è possibile utilizzare il leggere() e Scrivi() funzione per leggere e scrivere nel descrittore di file appena creato.

Ora, immagina una situazione in cui vuoi leggere da un file specifico usando scanf() o getc() funzione e scrivere su un altro file usando printf() funzione. Questo non è il comportamento predefinito del scanf(), getc() e printf() funziona come ho spiegato prima. Per impostazione predefinita, scanf() e getc() la funzione usa standard e printf() usa stdout e non c'è modo di dire a queste funzioni di usare altri descrittori di file. Quindi, per modificare questo comportamento predefinito, devi sostituire il standard e stdout descrittori di file con i descrittori di file desiderati. Questo è ciò che dup2() la funzione di sistema non. Il dup2() la funzione copia un descrittore di file in un altro descrittore di file.

dup2() Sintassi e valore restituito:

La sintassi di dup2() la funzione è:

int dup2(int vecchio_descrittore_file, int nuovo_descrittore_file);

dup2() la funzione copia il old_file_descriptor dentro new_file_descriptor. Se la new_file_descriptor esiste già, quindi si chiude automaticamente e poi il old_file_descriptor è copiato su di esso.

In caso di successo, il dup2() la funzione restituisce il nuovo descrittore di file. Se si verifica un errore, dup2() ritorna -1.

Il dup2() la funzione è definita nel file di intestazione unistd.h.

Devi includere l'intestazione unistd.h nel tuo file sorgente C per usare il dup2() funzionare come segue:

#includere

Per maggiori informazioni, controlla la pagina man di dup2() con il seguente comando:

$ uomo dup2

Esempio 1:

Crea un nuovo file sorgente C 01_dup2.c e digita le seguenti righe di codici nel file.

#includere
#includere
#includere
#includere
 
int main(void)
int numero1, numero2, somma;
 
int input_fds = open("./ingresso.txt", O_RDONLY);
 
if(dup2(input_fds, STDIN_FILENO) < 0)
printf("Impossibile duplicare il descrittore di file.");
exit(EXIT_FAILURE);

 
scanf("%d %d", &numero1, &numero2);
 
somma = numero1 + numero2;
 
printf("%d + %d = %d\n", numero1, numero2, somma);
 
restituire EXIT_SUCCESS;

Ora crea un nuovo file ingresso.TXT nella stessa directory e digita la seguente riga al suo interno.

15 41

L'obiettivo principale di questo programma è leggere 2 numeri interi dal ingresso.TXT file usando scanf() funzione, aggiungili e stampa la somma.

Innanzitutto, ho incluso i file di intestazione richiesti con le seguenti righe di codici.

#includere
#includere
#includere
#includere

Nel principale() funzione, ho definito le variabili richieste.

int numero1, numero2, somma;

Quindi, ho aperto il file ingresso.TXT in modalità di sola lettura (O_RDONLY) usando il Aperto() funzione e memorizzato il descrittore di file nella variabile input_fds.

int input_fds = open("./ingresso.txt", O_RDONLY);

Una volta che ho il descrittore di file del ingresso.TXT file, ho copiato il descrittore di file nel descrittore di file di input standard STDIN_FILENO (0) usando dup2() funzione. Il descrittore di file di ingresso.TXT è ora l'impostazione predefinita standard descrittore di file.

dup2(input_fds, STDIN_FILENO)

potrei anche scrivere il dup2() funzione come segue. Il risultato sarebbe lo stesso. STDIN_FILENO tiene il valore 0, che è il valore di standard descrittore di file.

dup2(input_fds, 0)

Ho anche controllato dup2() errori con le seguenti righe. Se si verifica un errore, il programma è impostato per stampare un messaggio di errore e uscire.

if(dup2(input_fds, STDIN_FILENO) < 0)
printf("Impossibile duplicare il descrittore di file.");
exit(EXIT_FAILURE);

Poi, ho usato scanf() per scansionare 2 numeri dal ingresso.TXT file.

scanf("%d %d", &numero1, &numero2);

Quindi, ho aggiunto i numeri e stampato la somma sulla console/terminale, l'impostazione predefinita stdout.

somma = numero1 + numero2;
printf("%d + %d = %d\n", numero1, numero2, somma);

Come puoi vedere, ho ottenuto l'output previsto una volta eseguito il programma.

Esempio 2:

Crea un nuovo file sorgente C 02_dup2.c e digita le seguenti righe di codici nel file.

#includere
#includere
#includere
#includere
#includere
#includere
int main(void)
int numero1, numero2, somma;
int input_fds = open("./ingresso.txt", O_RDONLY);
int output_fds = open("./produzione.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2(input_fds, STDIN_FILENO);
dup2(output_fds, STDOUT_FILENO);
scanf("%d %d", &numero1, &numero2);
somma = numero1 + numero2;
printf("%d + %d = %d\n", numero1, numero2, somma);
restituire EXIT_SUCCESS;

Ora crea un nuovo file ingresso.TXT nella stessa directory e digita la seguente riga al suo interno.

15 41

In questo programma, ho fatto la stessa cosa di in Esempio 1. L'unica differenza è che ho creato un nuovo file produzione.TXT e ha usato il descrittore di file di output.txt come predefinito stdout descrittore di file utilizzando il dup2() funzione. Ora, tutto l'output del printf() la funzione verrà scritta in produzione.TXT file.

Ho creato un nuovo file e memorizzato il descrittore di file in output_fds variabile.

int output_fds = open("./produzione.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

Ho anche copiato il descrittore di file output_fds nel descrittore di file stdout. Ho usato la costante predefinita STDOUT_FILENO.

dup2(output_fds, STDOUT_FILENO);

STDOUT_FILENO contiene il valore 1 (il valore del descrittore di file predefinito di stdout). Quindi, potrei riscrivere la chiamata alla funzione dup2() come segue. Darebbe gli stessi risultati.

dup2(output_fds, 1);

Il resto del programma è lo stesso. Come puoi vedere, una volta eseguito il programma, non stampa nulla sulla console/terminale.

Ma il programma ha creato un nuovo file produzione.TXT file.

Come puoi vedere, l'output viene scritto nel file produzione.TXT.

Se vuoi scrivere tutti gli errori (stderr) in un altro file, quindi puoi anche copiare un descrittore di file in stderr descrittore di file come segue.

dup2(error_fds, STDERR_FILENO);

Quindi, è così che usi il dup2() chiamata di sistema in Do. Grazie per aver letto questo articolo.

Emula i clic del mouse passando il mouse utilizzando il mouse senza clic in Windows 10
L'uso di un mouse o di una tastiera nella postura sbagliata di un uso eccessivo può causare molti problemi di salute, tra cui tensione, sindrome del t...
Aggiungi i gesti del mouse a Windows 10 utilizzando questi strumenti gratuiti
Negli ultimi anni computer e sistemi operativi si sono notevolmente evoluti greatly. C'è stato un tempo in cui gli utenti dovevano usare i comandi per...
Controlla e gestisci il movimento del mouse tra più monitor in Windows 10
Gestore mouse con doppio display ti consente di controllare e configurare il movimento del mouse tra più monitor, rallentando i suoi movimenti vicino ...