C Programmering

dup2 Systemopkald i C

dup2 Systemopkald i C
Det dup2 () systemfunktion bruges til at oprette en kopi af en eksisterende filbeskrivelse. I Linux er der 3 standardfilbeskrivere. De er:

stdin: Dette er standardinputfilbeskrivelsen. Det bruges til at tage input fra terminalen som standard. scanf (), getc () osv. funktioner bruger stdin filbeskrivelse for at tage brugerinput. Det stdin filbeskrivelse er også repræsenteret af nummeret 0.

stdout: Dette er standardoutputfilbeskrivelsen. Det bruges som standard til at udskrive noget til konsollen / terminalen. Den udbredte printf () funktion bruger stdout for at udskrive det ønskede output til konsollen / terminalen. Det stdout filbeskrivelse er også repræsenteret af nummeret 1.

stderr: Dette er standardfejlfilbeskrivelsen. Det gør det samme som stdout filbeskrivelse. Det stderr filbeskrivelse bruges til at udskrive fejlmeddelelser på konsollen / terminalen. Den eneste forskel er, hvis du bruger stderr filbeskrivelse for at udskrive fejlmeddelelserne, og stdout filbeskrivelse for at udskrive normale output, så kan du senere adskille dem. For eksempel kan du omdirigere fejlmeddelelserne til en fil og normale output til konsollen eller en anden fil. Det stderr filbeskrivelse er også repræsenteret af nummeret 2.

Bortset fra disse 3 filbeskrivelser kan du oprette yderligere filbeskrivelser i C. For at oprette en ny filbeskrivelse kan du bruge åben() funktion i C. Det åben() funktion åbner en ny fil, opretter en filbeskrivelse for den fil og vedhæfter et andet nummer end 0, 1, 2 til filbeskrivelsen.

Når du åbner en fil ved hjælp af åben() funktion, kan du bruge Læs() og skrive() funktion til at læse og skrive til den nyoprettede filbeskrivelse.

Forestil dig nu en situation, hvor du vil læse fra en bestemt fil ved hjælp af scanf () eller getc () funktion og skriv til en anden fil ved hjælp af printf () fungere. Dette er ikke standardadfærden for scanf (), getc () og printf () fungerer som jeg forklarede tidligere. Som standard, scanf () og getc () funktion bruger stdin og printf () anvendelser stdout og der er ingen måde at fortælle disse funktioner at bruge andre filbeskrivelser. Så for at ændre denne standardadfærd skal du erstatte stdin og stdout filbeskrivere med dine ønskede filbeskrivere. Dette er hvad dup2 () systemfunktion gør. Det dup2 () funktion kopierer en filbeskrivelse til en anden filbeskrivelse.

dup2 () Syntaks og returværdi:

Syntaksen for dup2 () funktion er:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () funktion kopierer old_file_descriptor ind i ny_fil_descriptor. Hvis den ny_fil_descriptor eksisterer allerede, lukkes den automatisk og derefter old_file_descriptor kopieres til det.

På succes, den dup2 () -funktionen returnerer den nye filbeskrivelse. Hvis der opstår en fejl, dup2 () vender tilbage -1.

Det dup2 () funktion er defineret i headerfilen unistd.h.

Du skal medtage overskriften unistd.h i din C-kildefil for at bruge dup2 () fungerer som følger:

#omfatte

For mere information, se mandsiden til dup2 () med følgende kommando:

$ mand dup2

Eksempel 1:

Opret en ny C-kildefil 01_dup2.c og skriv følgende linjer med koder i filen.

#omfatte
#omfatte
#omfatte
#omfatte
 
int main (ugyldigt)
int nummer1, nummer2, sum;
 
int input_fds = åben ("./ input.txt ", O_RDONLY);
 
hvis (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Kan ikke duplikere filbeskrivelse.");
Afslut (EXIT_FAILURE);

 
scanf ("% d% d", & number1, & number2);
 
sum = tal1 + tal2;
 
printf ("% d +% d =% d \ n", nummer1, nummer2, sum);
 
returner EXIT_SUCCESS;

Opret nu en ny fil input.txt i samme bibliotek, og skriv følgende linje i den.

15 41

Hovedformålet med dette program er at læse 2 heltal fra input.txt fil ved hjælp af scanf () funktion, tilføj dem og udskriv summen.

Først inkluderede jeg de påkrævede headerfiler med følgende linjer med koder.

#omfatte
#omfatte
#omfatte
#omfatte

I hoved () funktion definerede jeg de krævede variabler.

int nummer1, nummer2, sum;

Derefter åbnede jeg filen input.txt i skrivebeskyttet tilstand (O_RDONLY) bruger åben() funktion og gemt filbeskrivelsen i variablen input_fds.

int input_fds = åben ("./ input.txt ", O_RDONLY);

Når jeg først har filbeskrivelsen for input.txt fil, kopierede jeg filbeskrivelsen til standardinputfilbeskrivelsen STDIN_FILENO (0) ved hjælp af dup2 () fungere. Filbeskrivelsen for input.txt er nu 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 værdien 0, som er værdien af stdin filbeskrivelse.

dup2 (input_fds, 0)

Jeg tjekkede også efter dup2 () fejl med følgende linjer. Hvis der opstår en fejl, er programmet indstillet til at udskrive en fejlmeddelelse og afslutte.

hvis (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Kan ikke duplikere filbeskrivelse.");
Afslut (EXIT_FAILURE);

Så brugte jeg scanf () for at scanne 2 numre fra input.txt fil.

scanf ("% d% d", & nummer1, & nummer2);

Derefter tilføjede jeg numrene og udskrev summen på konsollen / terminalen, standard stdout.

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

Som du kan se, fik jeg det forventede output, når jeg kørte programmet.

Eksempel 2:

Opret en ny C-kildefil 02_dup2.c og skriv følgende linjer med koder i filen.

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
int main (ugyldigt)
int nummer1, nummer2, sum;
int input_fds = åben ("./ input.txt ", O_RDONLY);
int output_fds = åben ("./produktion.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 = tal1 + tal2;
printf ("% d +% d =% d \ n", nummer1, nummer2, sum);
returner EXIT_SUCCESS;

Opret nu en ny fil input.txt i samme bibliotek, og skriv følgende linje i den.

15 41

I dette program gjorde jeg det samme som i Eksempel 1. Den eneste forskel er, at jeg oprettede en ny fil produktion.txt og brugte filbeskrivelsen for output.txt som standard stdout filbeskrivelse ved hjælp af dup2 () fungere. Nu er al output fra printf () funktion vil blive skrevet til produktion.txt fil.

Jeg oprettede en ny fil og lagrede filbeskrivelsen i output_fds variabel.

int output_fds = åben ("./produktion.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

Jeg kopierede også output_fds-filbeskrivelsen til stdout-filbeskrivelsen. Jeg brugte den foruddefinerede konstant STDOUT_FILENO.

dup2 (output_fds, STDOUT_FILENO);

STDOUT_FILENO indeholder værdien 1 (standardfilbeskrivelsesværdien for stdout). Så jeg kunne omskrive dup2 () funktionsopkald som følger. Det ville give de samme resultater.

dup2 (output_fds, 1);

Resten af ​​programmet er den samme. Som du kan se, når jeg kører programmet, udskriver det ikke noget på konsollen / terminalen.

Men programmet oprettede en ny fil produktion.txt fil.

Som du kan se, skrives output til filen produktion.txt.

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

dup2 (error_fds, STDERR_FILENO);

Så det er sådan, du bruger dup2 () systemopkald i C. Tak, fordi du læste denne artikel.

Mus AppyMouse pegefelt på skærmen og musemarkør til Windows-tablets
AppyMouse pegefelt på skærmen og musemarkør til Windows-tablets
Tabletbrugere savner ofte musemarkøren, især når de er vante til at bruge bærbare computere. Touchscreen-smartphones og tablets har mange fordele, og ...
Mus Midterste museknap fungerer ikke i Windows 10
Midterste museknap fungerer ikke i Windows 10
Det midterste museknap hjælper dig med at rulle gennem lange websider og skærme med en masse data. Hvis det stopper, vil du ende med at bruge tastatur...
Mus Sådan ændres venstre og højre museknap på Windows 10-pc
Sådan ændres venstre og højre museknap på Windows 10-pc
Det er en ganske normal, at alle computermusenheder er ergonomisk designet til højrehåndede brugere. Men der er musenheder til rådighed, der er specie...