C Programovanie

dup2 Systémové volanie v C

dup2 Systémové volanie v C
The dup2 () systémová funkcia sa používa na vytvorenie kópie existujúceho deskriptora súboru. V systéme Linux existujú 3 štandardné deskriptory súborov. Oni sú:

stdin: Toto je štandardný deskriptor vstupného súboru. Štandardne sa používa na prijatie vstupu z terminálu. scanf (), getc () používa funkcie atď stdin deskriptor súborov na prijímanie vstupov používateľa. The stdin deskriptor súboru je tiež predstavovaný číslom 0.

stdout: Toto je štandardný deskriptor výstupných súborov. Štandardne sa používa na tlač niečoho na konzolu / terminál. Široko používaný printf () funkcia používa stdout pre tlač požadovaného výstupu na konzolu / terminál. The stdout deskriptor súboru je tiež predstavovaný číslom 1.

stderr: Toto je štandardný deskriptor súborov chýb. Robí to isté ako stdout deskriptor súborov. The stderr deskriptor súborov sa používa na tlač chybových správ na konzole / termináli. Jediný rozdiel je, ak používate stderr - deskriptor súborov na tlač chybových správ a - stdout deskriptor súborov na tlač normálnych výstupov, ktoré potom môžete oddeliť. Chybové správy môžete napríklad presmerovať do súboru a bežné výstupy do konzoly alebo iného súboru. The stderr deskriptor súboru je tiež predstavovaný číslom 2.

Okrem týchto 3 deskriptorov súborov môžete v C vytvoriť ďalšie deskriptory súborov. Ak chcete vytvoriť nový deskriptor súborov, môžete použiť otvorené() funkcia v C. The otvorené() funkcia otvorí nový súbor, vytvorí pre tento súbor deskriptor súboru a pripojí iné číslo ako 0, 1, 2 do deskriptora súboru.

Po otvorení súboru pomocou otvorené() funkciu, môžete použiť čítať() a napíš () funkcia na čítanie a zápis do novovytvoreného deskriptora súboru.

Teraz si predstavte situáciu, keď chcete čítať z konkrétneho súboru pomocou scanf () alebo getc () funkcie a zápis do iného súboru pomocou printf () funkcia. Toto nie je predvolené správanie servera scanf (), getc () a printf () funkcie, ako som už vysvetlil. Predvolene, scanf () a getc () funkcia používa stdin a printf () používa stdout a neexistuje spôsob, ako povedať týmto funkciám, aby používali iné deskriptory súborov. Ak chcete zmeniť toto predvolené správanie, musíte nahradiť stdin a stdout deskriptory súborov s požadovanými deskriptormi súborov. To je to, čo dup2 () funkcia systému áno. The dup2 () funkcia skopíruje deskriptor súboru do iného deskriptora súboru.

dup2 () Syntax a návratová hodnota:

Syntax súboru dup2 () funkcia je:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () funkcia kopíruje old_file_descriptor do new_file_descriptor. Ak deskriptor nového_súboru už existuje, potom sa automaticky zatvorí a potom old_file_descriptor je do nej skopírovaný.

O úspechu dup2 () funkcia vráti nový deskriptor súboru. Ak sa vyskytne chyba, dup2 () vracia -1.

The dup2 () funkcia je definovaná v hlavičkovom súbore unistd.h.

Musíte zahrnúť hlavičku unistd.h vo vašom zdrojovom súbore C, aby ste mohli používať dup2 () fungujú nasledovne:

#include

Viac informácií nájdete na manuálovej stránke dup2 () nasledujúcim príkazom:

$ man dup2

Príklad 1:

Vytvorte nový zdrojový súbor C 01_dup2.c a do súboru zadajte nasledujúce riadky kódov.

#include
#include
#include
#include
 
int main (void)
int číslo1, číslo2, súčet;
 
int input_fds = open ("./ vstup.txt ", O_RDONLY);
 
if (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Nie je možné duplikovať deskriptor súboru.");
výstup (EXIT_FAILURE);

 
scanf ("% d% d", & number1, & number2);
 
suma = cislo1 + cislo2;
 
printf ("% d +% d =% d \ n", číslo1, číslo2, súčet);
 
návrat EXIT_SUCCESS;

Teraz vytvorte nový súbor vstup.TXT v rovnakom adresári a zadajte do neho nasledujúci riadok.

15 41

Hlavným cieľom tohto programu je prečítať 2 celé čísla z čísla vstup.TXT súbor pomocou scanf () funkciu, pridajte ich a vytlačte súčet.

Najskôr som do nasledujúcich riadkov kódov zahrnul požadované hlavičkové súbory.

#include
#include
#include
#include

V hlavný() funkcie som definoval požadované premenné.

int číslo1, číslo2, súčet;

Potom som otvoril súbor vstup.TXT v režime iba na čítanie (O_RDONLY) pomocou otvorené() funkciu a do premennej uložil deskriptor súborov input_fds.

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

Len čo budem mať deskriptor súborov vstup.TXT súboru, skopíroval som deskriptor súboru do štandardného vstupného deskriptora súboru STDIN_FILENO (0) použitie dup2 () funkcia. Deskriptor súboru vstup.TXT je teraz predvolená stdin deskriptor súborov.

dup2 (input_fds, STDIN_FILENO)

Tiež by som mohol napísať dup2 () fungujú nasledovne. Výsledok by bol rovnaký. STDIN_FILENO drží hodnotu 0, čo je hodnota stdin deskriptor súborov.

dup2 (input_fds, 0)

Tiež som skontroloval dup2 () chyby s nasledujúcimi riadkami. Ak sa vyskytne chyba, program je nastavený na tlač chybového hlásenia a ukončenie.

if (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Nie je možné duplikovať deskriptor súborov.");
výstup (EXIT_FAILURE);

Potom som použil scanf () skenovať 2 čísla z vstup.TXT spis.

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

Potom som pridal čísla a vytlačil sumu na konzolu / terminál, predvolené stdout.

suma = cislo1 + cislo2;
printf ("% d +% d =% d \ n", číslo1, číslo2, súčet);

Ako vidíte, očakávaný výstup som dostal po spustení programu.

Príklad 2:

Vytvorte nový zdrojový súbor C 02_dup2.c a do súboru zadajte nasledujúce riadky kódov.

#include
#include
#include
#include
#include
#include
int main (void)
int číslo1, číslo2, súčet;
int input_fds = open ("./ vstup.txt ", O_RDONLY);
int output_fds = open ("./výkon.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (output_fds, STDOUT_FILENO);
scanf ("% d% d", & number1, & number2);
suma = cislo1 + cislo2;
printf ("% d +% d =% d \ n", číslo1, číslo2, súčet);
návrat EXIT_SUCCESS;

Teraz vytvorte nový súbor vstup.TXT v rovnakom adresári a zadajte do neho nasledujúci riadok.

15 41

V tomto programe som urobil to isté ako v Príklad 1. Rozdiel je iba v tom, že som vytvoril nový súbor výkon.TXT a použil deskriptor súboru výstupu.txt ako predvolený stdout deskriptor súborov pomocou dup2 () funkcia. Teraz je všetok výstup z printf () funkcia bude zapísaná do výkon.TXT spis.

Vytvoril som nový súbor a uložil som doň deskriptor súborov output_fds premenná.

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

Tiež som skopíroval deskriptor súboru output_fds do deskriptora štandardného súboru. Použil som preddefinovanú konštantu STDOUT_FILENO.

dup2 (output_fds, STDOUT_FILENO);

STDOUT_FILENO obsahuje hodnotu 1 (predvolená hodnota deskriptora súboru stdout). Takže by som mohol prepísať volanie funkcie dup2 () nasledovne. Poskytlo by to rovnaké výsledky.

dup2 (output_fds, 1);

Zvyšok programu je rovnaký. Ako vidíte, po spustení programu sa na konzole / termináli nič nevytlačí.

Ale program vytvoril nový súbor výkon.TXT spis.

Ako vidíte, výstup sa zapíše do súboru výkon.TXT.

Ak chcete zapísať všetky chyby (stderr) do iného súboru, potom môžete tiež skopírovať deskriptor súboru do stderr deskriptor súborov nasledovne.

dup2 (error_fds, STDERR_FILENO);

Takto teda používate dup2 () systémové volanie v C. Ďakujeme, že ste si prečítali tento článok.

Hry Ako zvýšiť rýchlosť FPS v systéme Linux?
Ako zvýšiť rýchlosť FPS v systéme Linux?
FPS znamená Počet snímok za sekundu. Úlohou FPS je merať snímkovú frekvenciu pri prehrávaní videa alebo herných výkonoch. Jednoducho povedané, počet n...
Hry Najlepšie hry Oculus App Lab
Najlepšie hry Oculus App Lab
Ak ste vlastníkom náhlavnej súpravy Oculus, musíte byť informovaní o bočnom nakladaní. Sideloading je proces inštalácie neuloženého obsahu do náhlavne...
Hry Top 10 hier, ktoré sa dajú hrať na Ubuntu
Top 10 hier, ktoré sa dajú hrať na Ubuntu
Platforma Windows je jednou z dominujúcich platforiem pre hry kvôli obrovskému percentu hier, ktoré sa dnes vyvíjajú na natívnu podporu systému Window...