C Programmering

dup2 Systemanrop i C

dup2 Systemanrop i C
De dup2 () systemfunksjonen brukes til å lage en kopi av en eksisterende filbeskrivelse. I Linux er det 3 standardfilbeskrivere. De er:

stdin: Dette er standard beskrivelse av inndatafiler. Den brukes som standard til å ta input fra terminalen. scanf (), getc () etc funksjoner bruker stdin filbeskrivelse for å ta brukerinnganger. De stdin filbeskrivelse er også representert med nummeret 0.

stdout: Dette er standard utskriftsfilbeskrivelse. Den brukes til å skrive ut noe til konsollen / terminalen som standard. Den mye brukte printf () funksjonen bruker stdout for å skrive ut ønsket utgang til konsollen / terminalen. De stdout filbeskrivelse er også representert med nummeret 1.

stderr: Dette er standard feilfilbeskrivelse. Det gjør det samme som stdout filbeskrivelse. De stderr filbeskrivelse brukes til å skrive ut feilmeldinger på konsollen / terminalen. Den eneste forskjellen er om 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 til et annet nummer enn 0, 1, 2 til filbeskrivelsen.

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

Tenk deg 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 () fungerer som jeg forklarte tidligere. Som standard, scanf () og getc () funksjonen bruker stdin og printf () bruker stdout og det er ingen måte å fortelle disse funksjonene å bruke andre filbeskrivelser. Så, for å endre denne standardatferden, må du erstatte stdin og stdout filbeskrivere med ønsket filbeskrivelse. Dette er hva dup2 () systemfunksjon gjør. De dup2 () funksjon kopierer en filbeskrivelse til en annen filbeskrivelse.

dup2 () Syntaks og returverdi:

Syntaksen til dup2 () funksjonen er:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () funksjon kopierer old_file_descriptor inn i det ny_fil_descriptor. Hvis den ny_fil_descriptor allerede eksisterer, lukkes den automatisk og deretter old_file_descriptor kopieres til den.

På suksess, den dup2 () -funksjonen returnerer den nye filbeskrivelsen. Hvis det oppstår en feil, dup2 () returnerer -1.

De dup2 () funksjon er definert i toppteksten unistd.h.

Du må ta med overskriften unistd.h i C-kildefilen din for å bruke dup2 () fungerer som følger:

#inkludere

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

$ man dup2

Eksempel 1:

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

#inkludere
#inkludere
#inkludere
#inkludere
 
int main (ugyldig)
int tall1, nummer2, sum;
 
int input_fds = open ("./ inngang.txt ", O_RDONLY);
 
hvis (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Kan ikke duplisere filbeskrivelsen.");
Avslutt (EXIT_FAILURE);

 
scanf ("% d% d", & number1, & number2);
 
sum = nummer1 + nummer2;
 
printf ("% d +% d =% d \ n", nummer1, nummer2, sum);
 
returner 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 to heltall fra inngang.tekst fil ved hjelp av scanf () funksjon, legg dem til og skriv ut summen.

Først inkluderte jeg de nødvendige headerfilene med følgende kodelinjer.

#inkludere
#inkludere
#inkludere
#inkludere

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

int tall1, nummer2, sum;

Så åpnet jeg filen inngang.tekst i skrivebeskyttet modus (O_RDONLY) bruker åpen() funksjon og lagret filbeskrivelsen i variabelen input_fds.

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

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

dup2 (input_fds, STDIN_FILENO)

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

dup2 (input_fds, 0)

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

hvis (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Kan ikke duplisere filbeskrivelsen.");
Avslutt (EXIT_FAILURE);

Så brukte jeg scanf () for å skanne 2 tall fra inngang.tekst fil.

scanf ("% d% d", & number1, & number2);

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

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

Som du ser, fikk jeg forventet effekt når jeg kjørte programmet.

Eksempel 2:

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

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main (ugyldig)
int tall1, nummer2, sum;
int input_fds = open ("./ inngang.txt ", O_RDONLY);
int output_fds = open ("./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 + tall2;
printf ("% d +% d =% d \ n", nummer1, nummer2, sum);
returner 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 for utdata.txt som standard stdout filbeskrivelse ved hjelp av dup2 () funksjon. Nå, all produksjon av printf () funksjonen vil bli skrevet til produksjon.tekst fil.

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

int output_fds = open ("./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 den samme. Når du kjører programmet, skriver det ikke ut noe på konsollen / terminalen.

Men programmet opprettet en ny fil produksjon.tekst fil.

Som du kan se, blir utskriften skrevet til filen produksjon.tekst.

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

dup2 (error_fds, STDERR_FILENO);

Så, det er slik du bruker dup2 () systemanrop i C. Takk for at du leser denne artikkelen.

Mus Midterste museknapp fungerer ikke i Windows 10
Midterste museknapp fungerer ikke i Windows 10
De midtre museknapp hjelper deg med å bla gjennom lange websider og skjermer med mye data. Hvis det stopper, vil du ende opp med å bruke tastaturet ti...
Mus Hvordan endre venstre og høyre museknapp på Windows 10 PC
Hvordan endre venstre og høyre museknapp på Windows 10 PC
Det er ganske vanlig at alle datamusenheter er ergonomisk designet for høyrehendte brukere. Men det er tilgjengelige musenheter som er spesielt design...
Mus Etterlig museklikk ved å sveve med Clickless Mouse i Windows 10
Etterlig museklikk ved å sveve med Clickless Mouse i Windows 10
Bruk av mus eller tastatur i feil stilling for overdreven bruk kan føre til mange helseproblemer, inkludert belastning, karpaltunnelsyndrom og mer. I ...