dup2 systemanrop i c

dup2 systemanrop i c
De dup2 () Systemfunksjon brukes til å opprette en kopi av en eksisterende filbeskrivelse. I Linux er det 3 standard filbeskrivelser. De er:

stdin: Dette er standard inndatafilbeskrivelse. Det brukes til å ta innspill fra terminalen som standard. Scanf (), getc () etc funksjoner bruker stdin Filbeskrivelse for å ta brukerinnganger. De stdin Filbeskrivelsen er også representert med nummeret 0.

stdout: Dette er standardutgangsfilbeskrivelsen. Det brukes til å skrive ut noe til konsollen/terminalen som standard. Det mye brukte printf () Funksjonsbruk stdout For å skrive ut ønsket utgang til konsollen/terminalen. De stdout Filbeskrivelsen er også representert med nummeret 1.

Stderr: Dette er standardfilfilbeskrivelsen. Det gjør det samme som stdout Filbeskrivelse. De Stderr Filbeskrivelse brukes til å skrive ut feilmeldinger på konsollen/terminalen. Den eneste forskjellen er hvis du bruker Stderr Filbeskrivelse for å skrive ut feilmeldingene, og stdout Filbeskrivelse for å skrive ut normale utganger, så kan du senere skille dem. For eksempel kan du omdirigere feilmeldingene til en fil og normale utganger til konsollen eller en annen fil. De Stderr Filbeskrivelsen er også representert med nummeret 2.

Annet enn disse 3 filbeskrivelsene, kan du opprette flere filbeskrivelser i C. For å opprette en ny filbeskrivelse, kan du bruke åpen() funksjon i c. De åpen() Funksjonen åpner en ny fil, oppretter en filbeskrivelse for den filen og legger ved et annet tall enn 0, 1, 2 til filbeskrivelsen.

Når du har åpnet en fil ved hjelp av åpen() funksjon, du kan bruke lese() og skrive() Funksjon for å lese og skrive til den nyopprettede filbeskrivelsen.

Tenk deg nå en situasjon der du vil lese fra en bestemt fil ved hjelp av Scanf () eller getc () funksjon og skriv til en annen fil ved hjelp av printf () funksjon. Dette er ikke standardoppførselen til Scanf (), getc () og printf () funksjoner som jeg forklarte tidligere. Som standard, Scanf () og getc () Funksjonsbruk stdin og printf () bruker stdout Og det er ingen måte å fortelle disse funksjonene om å bruke andre filbeskrivelser. Så for å endre denne standardoppførselen, må du erstatte stdin og stdout Filbeskrivelser med dine ønskede filbeskrivelser. Dette er hva dup2 () Systemfunksjon gjør det. De dup2 () Funksjon kopierer en filbeskrivelse til en annen filbeskrivelse.

dup2 () syntaks og returverdi:

Syntaksen til dup2 () funksjon er:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () funksjon kopierer old_file_descriptor inn i det new_file_descriptor. Hvis new_file_descriptor eksisterer allerede, da er den automatisk lukket og deretter old_file_descriptor er kopiert til det.

Om suksess, den dup2 () Funksjonen returnerer den nye filbeskrivelsen. Hvis det oppstår en feil, dup2 () Returnerer -1.

De dup2 () Funksjonen er definert i overskriftsfilen Unistd.h.

Du må inkludere overskriften Unistd.h i C -kildefilen for å kunne bruke dup2 () funksjon som følger:

#inkludere

For mer informasjon, sjekk mannsiden til dup2 () med følgende kommando:

$ man dup2

Eksempel 1:

Opprett en ny C -kildefil 01_dup2.c og skriv inn følgende koder i filen.

#inkludere
#inkludere
#inkludere
#inkludere
int main (void)
int nummer1, nummer2, sum;
int input_fds = åpen ("./input.txt ", o_rdonly);
if (dup2 (input_fds, stdin_fileno) < 0)
printf ("Kan ikke duplisere filbeskrivelsen.");
exit (exit_failure);

SCANF (" %D %D", & NUMBER1, & NUMBER2);
sum = nummer1 + nummer2;
printf (" %d + %d = %d \ n", nummer1, nummer2, sum);
return exit_success;

Lag nå en ny fil inngang.tekst I samme katalog og skriv inn følgende linje i den.

15 41

Hovedmålet med dette programmet er å lese 2 heltallnumre fra inngang.tekst filen bruker Scanf () funksjon, legg til dem og skriv ut summen.

Først inkluderte jeg de nødvendige overskriftsfilene med følgende koderlinjer.

#inkludere
#inkludere
#inkludere
#inkludere

I hoved() Funksjon, jeg definerte de nødvendige variablene.

int nummer1, nummer2, sum;

Deretter åpnet jeg filen inngang.tekst bare i lesemodus (O_rdonly) bruker åpen() funksjon og lagret filbeskrivelsen i variabelen input_fds.

int input_fds = åpen ("./input.txt ", o_rdonly);

Når jeg har filbeskrivelsen til inngang.tekst fil, jeg kopierte filbeskrivelsen til standard inndatafilbeskrivelsen STDIN_FILENO (0) Bruke dup2 () funksjon. Filbeskrivelsen til inngang.tekst er nå standard stdin Filbeskrivelse.

dup2 (input_fds, stdin_fileno)

Jeg kunne også skrive dup2 () funksjon som følger. Resultatet ville være det samme. STDIN_FILENO har verdien 0, som er verdien av stdin Filbeskrivelse.

dup2 (input_fds, 0)

Jeg sjekket også for dup2 () feil med følgende linjer. Hvis det oppstår en feil, er programmet satt til å skrive ut en feilmelding og avslutning.

if (dup2 (input_fds, stdin_fileno) < 0)
printf ("Kan ikke duplisere filbeskrivelsen.");
exit (exit_failure);

Deretter brukte jeg Scanf () å skanne 2 tall fra inngang.tekst fil.

SCANF (" %D %D", & NUMBER1, & NUMBER2);

Deretter la jeg til tallene og trykket summen på konsollen/terminalen, standard stdout.

sum = nummer1 + nummer2;
printf (" %d + %d = %d \ n", nummer1, nummer2, sum);

Som du ser, fikk jeg forventet utdata når jeg kjører programmet.

Eksempel 2:

Opprett en ny C -kildefil 02_dup2.c og skriv inn følgende koder i filen.

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main (void)
int nummer1, nummer2, sum;
int input_fds = åpen ("./input.txt ", o_rdonly);
int output_fds = åpen ("./produksjon.txt ", o_wronly | o_creat, s_irusr | s_iwusr);
dup2 (input_fds, stdin_fileno);
dup2 (output_fds, stdout_fileno);
SCANF (" %D %D", & NUMBER1, & NUMBER2);
sum = nummer1 + nummer2;
printf (" %d + %d = %d \ n", nummer1, nummer2, sum);
return exit_success;

Lag nå en ny fil inngang.tekst I samme katalog og skriv inn følgende linje i den.

15 41

I dette programmet gjorde jeg det samme som i Eksempel 1. Den eneste forskjellen er at jeg opprettet en ny fil produksjon.tekst og brukte filbeskrivelsen til utdata.txt som standard stdout Filbeskrivelse ved hjelp av dup2 () funksjon. Nå, all utgangen fra printf () funksjon vil bli skrevet til produksjon.tekst fil.

Jeg opprettet en ny fil og lagret filbeskrivelsen i output_fds variabel.

int output_fds = åpen ("./produksjon.txt ", o_wronly | o_creat, s_irusr | s_iwusr);

Jeg kopierte også output_fds -filbeskrivelsen til stdout -filbeskrivelsen. Jeg brukte den forhåndsdefinerte konstanten Stdout_fileno.

dup2 (output_fds, stdout_fileno);

Stdout_fileno inneholder verdien 1 (Standard filbeskrivelsesverdi på stdout). Så jeg kunne omskrive dup2 () funksjonsanrop som følger. Det ville gi de samme resultatene.

dup2 (output_fds, 1);

Resten av programmet er det samme. Som du ser, når jeg kjører programmet, skriver det ikke ut noe på konsollen/terminalen.

Men programmet opprettet en ny fil produksjon.tekst fil.

Som du kan se, skrives utgangen til filen produksjon.tekst.

Hvis du vil skrive alle feil (Stderr) til en annen fil, så kan du også kopiere en filbeskrivelse til Stderr Filbeskrivelse som følger.

dup2 (error_fds, stderr_fileno);

Så det er slik du bruker dup2 () Systemanrop i C. Takk for at du leste denne artikkelen.