Chiama di sistema DUP2 in C

Chiama di sistema DUP2 in C
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:

stdin: Questo è il descrittore di file di input standard. Viene utilizzato per prendere input dal terminale per impostazione predefinita. scanf (), getc () ETC FUNZIONI USI stdin Descrittore di file per prendere gli input dell'utente. IL stdin Il descrittore di file è anche rappresentato dal numero 0.

stdout: Questo è il descrittore dei file di output standard. Viene utilizzato per stampare qualcosa alla console/terminale per impostazione predefinita. Il ampiamente usato printf () usi della funzione stdout Per stampare l'output desiderato sulla console/terminale. IL stdout Il descrittore di file è anche 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 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 puoi separarli in seguito. Ad esempio, è possibile reindirizzare i messaggi di errore a un file e output normali alla console o ad un altro file. IL Stderr Il descrittore di file è anche rappresentato dal numero 2.

Oltre a questi 3 descrittori di file, è possibile creare ulteriori descrittori di file in C. Per creare un nuovo descrittore di file, è possibile utilizzare il aprire() funzione in c. IL aprire() 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 aprire() funzione, puoi usare il Leggere() E scrivere() funzione da leggere e scrivere al descrittore di file appena creato.

Ora, immagina una situazione in cui vuoi leggere da un file specifico utilizzando scanf () O getc () Funzionare e scrivere su un altro file utilizzando printf () funzione. Questo non è il comportamento predefinito del scanf (), getc () E printf () funzioni come ho spiegato in precedenza. Per impostazione predefinita, scanf () E getc () usi della funzione stdin E printf () usi stdout E non c'è modo di dire a queste funzioni di utilizzare altri descrittori di file. Quindi, per modificare questo comportamento predefinito, devi sostituire il stdin E stdout Descrittori di file con i descrittori di file desiderati. Questo è ciò che dup2 () la funzione di sistema lo fa. IL dup2 () La funzione copia un descrittore di file a un altro descrittore di file.

Dup2 () Sintassi e valore di ritorno:

La sintassi di dup2 () La funzione è:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () La funzione copia il old_file_descriptor dentro new_file_descriptor. Se la new_file_descriptor già esiste, quindi viene automaticamente chiuso e quindi il old_file_descriptor è copiato ad esso.

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

È necessario includere l'intestazione unistd.H nel tuo file di origine C per utilizzare il dup2 () funzione come segue:

#includere

Per ulteriori informazioni, controllare la pagina Man di dup2 () con il seguente comando:

$ man dup2

Esempio 1:

Crea un nuovo file di origine C 01_DUP2.C e digitare 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, e numero2);
Sum = Number1 + Number2;
printf (" %d + %d = %d \ n", numero1, numero2, somma);
restituire exit_success;

Ora, crea un nuovo file ingresso.TXT Nella stessa directory e digita nella riga seguente.

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à solo leggera (O_rdonly) usando il aprire() 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 il valore predefinito stdin Descrittore di file.

dup2 (input_fds, stdin_fileno)

Potrei anche scrivere il dup2 () funzionare come segue. Il risultato sarebbe lo stesso. Stdin_fileno contiene il valore 0, che è il valore del stdin Descrittore di file.

dup2 (input_fds, 0)

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

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

Quindi, ho usato scanf () Per scansionare 2 numeri dal ingresso.TXT file.

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

Quindi, ho aggiunto i numeri e ho stampato la somma sulla console/terminale, il valore predefinito stdout.

Sum = Number1 + Number2;
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 di origine C 02_DUP2.C e digitare 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, e numero2);
Sum = Number1 + Number2;
printf (" %d + %d = %d \ n", numero1, numero2, somma);
restituire exit_success;

Ora, crea un nuovo file ingresso.TXT Nella stessa directory e digita nella riga seguente.

15 41

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

Ho creato un nuovo file e archiviato 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 dei file stdout. Ho usato la costante predefinita Stdout_fileno.

dup2 (output_fds, stdout_fileno);

Stdout_fileno contiene il valore 1 (Il valore del descrittore dei file predefinito di stdout). Quindi, potrei riscrivere la chiamata di 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 stampano nulla sulla console/terminale.

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

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

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

dup2 (error_fds, stderr_fileno);

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