C Programmeren

dup2 Systeemoproep in C

dup2 Systeemoproep in C
De dup2() systeemfunctie wordt gebruikt om een ​​kopie te maken van een bestaande bestandsdescriptor. In Linux zijn er 3 standaard bestandsdescriptors. Zij zijn:

standaard: Dit is de standaard descriptor van het invoerbestand. Het wordt standaard gebruikt om invoer van de terminal te ontvangen. scanf(), getc() enz. Functies gebruikt: standaard bestandsdescriptor om gebruikersinvoer op te nemen. De standaard bestandsdescriptor wordt ook weergegeven door het nummer 0.

stout: Dit is de standaard descriptor van het uitvoerbestand. Het wordt standaard gebruikt om iets naar de console/terminal af te drukken. De veel gebruikte printf() functie gebruikt stout om de gewenste uitvoer naar de console/terminal af te drukken. De stout bestandsdescriptor wordt ook weergegeven door het nummer 1.

stderr: Dit is de standaard descriptor van het foutbestand. Het doet hetzelfde als de stout bestandsdescriptor. De stderr bestandsdescriptor wordt gebruikt om foutmeldingen af ​​te drukken op de console/terminal. Het enige verschil is of je gebruikt stderr bestandsdescriptor om de foutmeldingen af ​​te drukken, en stout bestandsdescriptor om normale uitvoer af te drukken, dan kunt u ze later scheiden. U kunt bijvoorbeeld de foutmeldingen omleiden naar een bestand en normale uitvoer naar de console of een ander bestand. De stderr bestandsdescriptor wordt ook weergegeven door het nummer 2.

Behalve deze 3 bestandsdescriptors, kunt u extra bestandsdescriptors maken in C. Om een ​​nieuwe bestandsdescriptor aan te maken, kunt u de Open() functie in C. De Open() functie opent een nieuw bestand, maakt een bestandsdescriptor voor dat bestand en voegt een ander nummer toe dan 0, 1, 2 naar de bestandsdescriptor.

Zodra u een bestand opent met Open() functie, kunt u de lezen() en schrijven() functie om te lezen en te schrijven naar de nieuw gemaakte bestandsdescriptor.

Stel je nu een situatie voor waarin je uit een specifiek bestand wilt lezen met scanf() of getc() functie en schrijf naar een ander bestand met printf() functie. Dit is niet het standaardgedrag van de scanf(), getc() en printf() functioneert zoals ik eerder heb uitgelegd. Standaard, scanf() en getc() functie gebruikt standaard en printf() toepassingen stout en er is geen manier om deze functies te vertellen dat ze andere bestandsdescriptors moeten gebruiken. Dus om dit standaardgedrag te wijzigen, moet u de standaard en stout bestandsdescriptors met uw gewenste bestandsdescriptors. Dit is wat de dup2() systeemfunctie doet:. De dup2() functie kopieert een bestandsdescriptor naar een andere bestandsdescriptor.

dup2() Syntaxis en retourwaarde:

De syntaxis van dup2() functie is:

int dup2(int oude_file_descriptor, int nieuwe_file_descriptor);

dup2() functie kopieert de old_file_descriptor in de nieuwe_file_descriptor. Als de nieuwe_file_descriptor al bestaat, dan wordt het automatisch gesloten en dan is de old_file_descriptor wordt ernaar gekopieerd.

Bij succes, de dup2() functie retourneert de nieuwe bestandsdescriptor. Als er een fout optreedt, dup2() geeft terug -1.

De dup2() functie is gedefinieerd in het headerbestand unistd.h.

U moet de koptekst opnemen unistd.h in uw C-bronbestand om de . te gebruiken dup2() functioneren als volgt:

#include

Kijk voor meer informatie op de man-pagina van dup2() met het volgende commando:

$ man dup2

Voorbeeld 1:

Een nieuw C-bronbestand maken 01_dup2.c en typ de volgende regels codes in het bestand:.

#include
#include
#include
#include
 
int main(void)
int getal1, getal2, som;
 
int input_fds = open("./invoer.txt", O_RDONLY);
 
if(dup2(input_fds, STDIN_FILENO) < 0)
printf("Kan bestandsbeschrijving niet dupliceren.");
afsluiten (EXIT_FAILURE);

 
scanf("%d %d", &nummer1, &nummer2);
 
som = getal1 + getal2;
 
printf("%d + %d = %d\n", getal1, getal2, som);
 
retourneer EXIT_SUCCESS;

Maak nu een nieuw bestand aan invoer.tekst in dezelfde map en typ de volgende regel erin:.

15 41

Het belangrijkste doel van dit programma is om 2 gehele getallen te lezen uit de invoer.tekst bestand met behulp van scanf() functie, voeg ze toe en druk de som af.

Eerst heb ik de vereiste header-bestanden met de volgende regels codes toegevoegd:.

#include
#include
#include
#include

In de hoofd() functie, heb ik de vereiste variabelen gedefinieerd.

int getal1, getal2, som;

Toen opende ik het bestand invoer.tekst in alleen-lezen modus (O_RDONLY) de ... gebruiken Open() functie en de bestandsdescriptor opgeslagen in de variabele input_fds.

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

Zodra ik de bestandsdescriptor van de invoer.tekst bestand, heb ik de bestandsdescriptor gekopieerd naar de standaard invoerbestandsdescriptor STDIN_FILENO (0) met behulp van dup2() functie. De bestandsdescriptor van invoer.tekst is nu de standaard standaard bestandsdescriptor.

dup2(input_fds, STDIN_FILENO)

Ik zou ook de write kunnen schrijven dup2() functie als volgt:. Het resultaat zou hetzelfde zijn. STDIN_FILENO houdt de waarde vast 0, wat is de waarde van de standaard bestandsdescriptor.

dup2(input_fds, 0)

Ik heb ook gecontroleerd op dup2() fouten met de volgende regels:. Als er toch een fout optreedt, is het programma ingesteld om een ​​foutmelding af te drukken en af ​​te sluiten.

if(dup2(input_fds, STDIN_FILENO) < 0)
printf("Kan bestandsbeschrijving niet dupliceren.");
afsluiten (EXIT_FAILURE);

Toen gebruikte ik scanf() om 2 nummers van de te scannen invoer.tekst het dossier.

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

Vervolgens heb ik de cijfers toegevoegd en de som afgedrukt op de console / terminal, de standaard stout.

som = getal1 + getal2;
printf("%d + %d = %d\n", getal1, getal2, som);

Zoals je kunt zien, kreeg ik de verwachte output toen ik het programma uitvoerde.

Voorbeeld 2:

Een nieuw C-bronbestand maken 02_dup2.c en typ de volgende regels codes in het bestand:.

#include
#include
#include
#include
#include
#include
int main(void)
int getal1, getal2, som;
int input_fds = open("./invoer.txt", O_RDONLY);
int output_fds = open("./uitvoer.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2(input_fds, STDIN_FILENO);
dup2(output_fds, STDOUT_FILENO);
scanf("%d %d", &nummer1, &nummer2);
som = getal1 + getal2;
printf("%d + %d = %d\n", getal1, getal2, som);
retourneer EXIT_SUCCESS;

Maak nu een nieuw bestand aan invoer.tekst in dezelfde map en typ de volgende regel erin:.

15 41

In dit programma deed ik hetzelfde als in voorbeeld 1. Het enige verschil is dat ik een nieuw bestand heb gemaakt uitvoer.tekst en gebruikte de bestandsdescriptor van output.txt als standaard stout bestandsdescriptor met behulp van de dup2() functie. Nu, alle uitvoer van de printf() functie zal worden geschreven naar de uitvoer.tekst het dossier.

Ik heb een nieuw bestand gemaakt en de bestandsdescriptor opgeslagen in output_fds variabele.

int output_fds = open("./uitvoer.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

Ik heb ook de output_fds bestandsdescriptor gekopieerd naar de stdout bestandsdescriptor. Ik heb de vooraf gedefinieerde constante gebruikt STDOUT_FILENO.

dup2(output_fds, STDOUT_FILENO);

STDOUT_FILENO bevat de waarde 1 (de standaard bestandsdescriptorwaarde van stout). Dus ik zou de functieaanroep dup2() als volgt kunnen herschrijven:. Het zou dezelfde resultaten geven.

dup2(output_fds, 1);

De rest van het programma is hetzelfde. Zoals je kunt zien, drukt het, zodra ik het programma heb uitgevoerd, niets af op de console/terminal.

Maar het programma heeft een nieuw bestand gemaakt uitvoer.tekst het dossier.

Zoals je kunt zien, wordt de uitvoer naar het bestand geschreven uitvoer.tekst.

Als u alle fouten wilt schrijven (stderr) naar een ander bestand, dan kunt u ook een bestandsdescriptor kopiëren naar stderr bestandsdescriptor als volgt:.

dup2(error_fds, STDERR_FILENO);

Dus zo gebruik je de dup2() systeemoproep in C. Bedankt voor het lezen van dit artikel.

Hoe FPS-teller in Linux-games te tonen
Linux-gaming kreeg een grote duw toen Valve in 2012 Linux-ondersteuning voor Steam-client en hun games aankondigde. Sindsdien hebben veel AAA- en indi...
Sid Meier's Civilization VI downloaden en spelen op Linux and
Inleiding tot het spel Civilization 6 is een moderne versie van het klassieke concept dat werd geïntroduceerd in de serie Age of Empires-games. Het id...
Doom installeren en spelen op Linux
Inleiding tot Doom De Doom-serie is ontstaan ​​in de jaren 90 na de release van de originele Doom. Het was meteen een hit en vanaf die tijd heeft de g...