C Programmering

dup2 Systemanrop i C

dup2 Systemanrop i C
De dup2 () systemfunktion används för att skapa en kopia av en befintlig filbeskrivare. I Linux finns det tre standardfilbeskrivare. Dom är:

stdin: Detta är standardinmatningsfilbeskrivaren. Den används för att ta inmatning från terminalen som standard. scanf (), getc () etc funktioner använder stdin filbeskrivare för att ta användarinmatningar. De stdin filbeskrivaren representeras också av numret 0.

stdout: Detta är standardutskriftsfilbeskrivaren. Den används för att skriva ut något till konsolen / terminalen som standard. Det allmänt använda printf () funktion använder stdout för att skriva ut önskad utgång till konsolen / terminalen. De stdout filbeskrivaren representeras också av numret 1.

stderr: Detta är standardfelbeskrivaren. Det gör samma sak som stdout filbeskrivare. De stderr filbeskrivaren används för att skriva ut felmeddelanden på konsolen / terminalen. Den enda skillnaden är om du använder stderr filbeskrivare för att skriva ut felmeddelandena och stdout filbeskrivare för att skriva ut normala utdata, så kan du senare separera dem. Du kan till exempel omdirigera felmeddelandena till en fil och normala utdata till konsolen eller en annan fil. De stderr filbeskrivaren representeras också av numret 2.

Förutom dessa 3 filbeskrivare kan du skapa ytterligare filbeskrivare i C. För att skapa en ny filbeskrivare kan du använda öppna() funktion i C. De öppna() funktionen öppnar en ny fil, skapar en filbeskrivare för den filen och bifogar ett annat nummer än 0, 1, 2 till filbeskrivaren.

När du öppnar en fil med öppna() funktion kan du använda läsa() och skriva() funktion för att läsa och skriva till den nyskapade filbeskrivaren.

Föreställ dig nu en situation där du vill läsa från en viss fil med scanf () eller getc () funktion och skriv till en annan fil med printf () fungera. Detta är inte standardbeteendet för scanf (), getc () och printf () fungerar som jag förklarade tidigare. Som standard, scanf () och getc () funktion använder stdin och printf () användningsområden stdout och det finns inget sätt att berätta för dessa funktioner att använda andra filbeskrivare. Så, för att ändra detta standardbeteende måste du byta ut stdin och stdout filbeskrivare med önskade filbeskrivare. Det här är vad dup2 () systemfunktionen gör det. De dup2 () funktionen kopierar en filbeskrivare till en annan filbeskrivare.

dup2 () Syntax och returvärde:

Syntaxen för dup2 () funktionen är:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () funktionen kopierar old_file_descriptor in i new_file_descriptor. Om den new_file_descriptor redan finns, stängs den automatiskt och sedan old_file_descriptor kopieras till den.

När det gäller framgång, dup2 () funktionen returnerar den nya filbeskrivaren. Om ett fel uppstår, dup2 () återvänder -1.

De dup2 () funktionen definieras i rubrikfilen unistd.h.

Du måste inkludera rubriken unistd.h i din C-källfil för att kunna använda dup2 () fungerar enligt följande:

#omfatta

För mer information, kolla mansidan för dup2 () med följande kommando:

$ man dup2

Exempel 1:

Skapa en ny C-källfil 01_dup2.c och skriv in följande rader med koder i filen.

#omfatta
#omfatta
#omfatta
#omfatta
 
int main (void)
int nummer1, nummer2, summa;
 
int input_fds = öppen ("./inmatning.txt ", O_RDONLY);
 
om (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Det går inte att duplicera filbeskrivaren.");
avsluta (EXIT_FAILURE);

 
scanf ("% d% d", & number1, & number2);
 
summa = nummer1 + nummer2;
 
printf ("% d +% d =% d \ n", nummer1, nummer2, summa);
 
returnera EXIT_SUCCESS;

Skapa nu en ny fil inmatning.Text i samma katalog och skriv in följande rad i den.

15 41

Huvudsyftet med detta program är att läsa två heltal från inmatning.Text fil med scanf () funktion, lägg till dem och skriv ut summan.

Först inkluderade jag de nödvändiga rubrikfilerna med följande rader med koder.

#omfatta
#omfatta
#omfatta
#omfatta

I huvud () funktion definierade jag de nödvändiga variablerna.

int nummer1, nummer2, summa;

Sedan öppnade jag filen inmatning.Text i skrivskyddat läge (O_RDONLY) använda öppna() funktion och lagrade filbeskrivaren i variabeln input_fds.

int input_fds = öppen ("./inmatning.txt ", O_RDONLY);

När jag väl har filbeskrivaren för inmatning.Text fil kopierade jag filbeskrivaren till standardinmatningsfilbeskrivaren STDIN_FILENO (0) använder dup2 () fungera. Filbeskrivaren för inmatning.Text är nu standard stdin filbeskrivare.

dup2 (input_fds, STDIN_FILENO)

Jag kunde också skriva dup2 () fungerar enligt följande. Resultatet skulle bli detsamma. STDIN_FILENO håller värdet 0, vilket är värdet på stdin filbeskrivare.

dup2 (input_fds, 0)

Jag kollade också efter dup2 () fel med följande rader. Om ett fel uppstår är programmet inställt på att skriva ut ett felmeddelande och avsluta.

om (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Det går inte att duplicera filbeskrivaren.");
avsluta (EXIT_FAILURE);

Sedan använde jag scanf () för att skanna 2 nummer från inmatning.Text fil.

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

Sedan lade jag till siffrorna och skrev ut summan på konsolen / terminalen, standard stdout.

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

Som du kan se fick jag den förväntade effekten när jag kör programmet.

Exempel 2:

Skapa en ny C-källfil 02_dup2.c och skriv in följande rader med koder i filen.

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
int main (void)
int nummer1, nummer2, summa;
int input_fds = öppen ("./inmatning.txt ", O_RDONLY);
int output_fds = öppen ("./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);
summa = nummer1 + nummer2;
printf ("% d +% d =% d \ n", nummer1, nummer2, summa);
returnera EXIT_SUCCESS;

Skapa nu en ny fil inmatning.Text i samma katalog och skriv in följande rad i den.

15 41

I det här programmet gjorde jag samma sak som i Exempel 1. Den enda skillnaden är att jag skapade en ny fil produktion.Text och använde filbeskrivaren för utdata.txt som standard stdout filbeskrivare med hjälp av dup2 () fungera. Nu, all produktion av printf () funktionen kommer att skrivas till produktion.Text fil.

Jag skapade en ny fil och lagrade filbeskrivaren i output_fds variabel.

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

Jag kopierade också output_fds-filbeskrivaren till stdout-filbeskrivaren. Jag använde den fördefinierade konstanten STDOUT_FILENO.

dup2 (output_fds, STDOUT_FILENO);

STDOUT_FILENO innehåller värdet 1 (standardfilbeskrivningsvärdet för stdout). Så jag kunde skriva om dup2 () -funktionsanrop enligt följande. Det skulle ge samma resultat.

dup2 (output_fds, 1);

Resten av programmet är detsamma. Som du kan se, när jag kör programmet skriver det inte ut något på konsolen / terminalen.

Men programmet skapade en ny fil produktion.Text fil.

Som du kan se skrivs utdata till filen produktion.Text.

Om du vill skriva alla fel (stderr) till en annan fil kan du också kopiera en filbeskrivare till stderr filbeskrivaren enligt följande.

dup2 (error_fds, STDERR_FILENO);

Så, det är så du använder dup2 () systemanrop i C. Tack för att du läste den här artikeln.

Bästa Linux Distros för spel 2021
Linux-operativsystemet har kommit långt från sitt ursprungliga, enkla, serverbaserade utseende. Detta operativsystem har förbättrats enormt de senaste...
Hur du fångar och strömmar din spelsession på Linux
Tidigare betraktades spel bara som en hobby, men med tiden såg spelindustrin en enorm tillväxt när det gäller teknik och antalet spelare. Spelpubliken...
Bästa spel att spela med handspårning
Oculus Quest introducerade nyligen den fantastiska idén om handspårning utan kontroller. Med ett ständigt ökande antal spel och aktiviteter som utför ...