C programozás

dup2 rendszerhívás C-ben

dup2 rendszerhívás C-ben
A dup2 () A rendszerfunkció egy meglévő fájlleíró másolatának létrehozására szolgál. Linux alatt 3 szabványos fájlleíró van. Ők:

stdin: Ez a szokásos bemeneti fájlleíró. Alapértelmezés szerint arra szolgál, hogy bemenetet vegyen a terminálról. scanf (), getc () stb függvények használ stdin fájlleíró a felhasználói adatok beviteléhez. A stdin a fájlleírót a szám is képviseli 0.

stdout: Ez a szokásos kimeneti fájlleíró. Alapértelmezés szerint a konzolra / terminálra nyomtatnak valamit. A széles körben használt printf () függvény használja stdout hogy kinyomtassa a kívánt kimenetet a konzolra / terminálra. A stdout a fájlleírót a szám is képviseli 1.

stderr: Ez a szokásos hibafájl-leíró. Ugyanazt csinálja, mint a stdout fájlleíró. A stderr A fájlleíró a hibaüzenetek nyomtatására szolgál a konzolon / terminálon. Az egyetlen különbség az, ha használja stderr fájlleíró a hibaüzenetek kinyomtatásához, és stdout fájlleíró a normál kimenetek kinyomtatásához, majd később szétválaszthatja őket. Például átirányíthatja a hibaüzeneteket egy fájlba, a normál kimeneteket pedig a konzolra vagy egy másik fájlra. A stderr a fájlleírót a szám is képviseli 2.

Ezen 3 fájlleírótól eltekintve további fájlleírókat hozhat létre C-ben. Új fájlleíró létrehozásához használhatja a nyisd ki() funkció a C-ben. A nyisd ki() függvény új fájlt nyit meg, létrehoz egy fájlleírót a fájlhoz, és nem 0, 1, 2 a fájlleíróhoz.

Miután megnyitott egy fájlt a nyisd ki() funkciót használhatja olvas() és ír() függvény az újonnan létrehozott fájlleíróhoz való íráshoz és íráshoz.

Képzeljen el egy olyan helyzetet, amikor egy adott fájlból szeretne olvasni scanf () vagy getc () funkciót, és írjon egy másik fájlba a printf () funkció. Ez nem az alapértelmezett viselkedése a scanf (), getc () és printf () úgy működik, ahogy azt korábban kifejtettem. Alapértelmezés szerint, scanf () és getc () függvény használja stdin és printf () használ stdout és nincs mód arra, hogy ezeket a függvényeket más fájlleírók használatára utasítsuk. Tehát ennek az alapértelmezett viselkedésnek a megváltoztatásához ki kell cserélnie a stdin és stdout fájlleírók a kívánt fájlleírókkal. Ez az, amit a dup2 () a rendszer funkciója igen. A dup2 () a function átmásol egy fájlleírót egy másik fájlleíróba.

dup2 () Szintaxis és visszatérési érték:

A szintaxisa dup2 () funkció:

int dup2 (int régi_fájl_leíró, int új_ fájl_leíró);

dup2 () függvény lemásolja a old_file_descriptor ba,-be új_fájl_leíró. Ha a új_fájl_leíró már létezik, akkor automatikusan bezáródik, majd a old_file_descriptor átmásolódik arra.

A sikeren a dup2 () függvény adja vissza az új fájlleírót. Ha hiba történik, dup2 () visszatér -1.

A dup2 () funkció a fejlécfájlban van meghatározva unistd.h.

Meg kell adnia a fejlécet unistd.h a C forrásfájlban a dup2 () az alábbiak szerint működik:

#include

További információért ellenőrizze a dup2 () a következő paranccsal:

$ man dup2

1. példa:

Hozzon létre egy új C forrásfájlt 01_dup2.c és írja be a fájl következő kódsorait.

#include
#include
#include
#include
 
int main (érvénytelen)
int szám1, szám2, összeg;
 
int input_fds = nyitott ("./bemenet.txt ", O_RDONLY);
 
if (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("A fájlleíró nem másolható.");
kilépés (EXIT_FAILURE);

 
scanf ("% d% d", & number1, & number2);
 
összeg = szám1 + szám2;
 
printf ("% d +% d =% d \ n", szám1, szám2, összeg);
 
visszatér EXIT_SUCCESS;

Most hozzon létre egy új fájlt bemenet.txt ugyanabban a könyvtárban, és írja be a következő sorba.

15 41

A program fő célja, hogy 2 egész számot olvasson le a bemenet.txt fájl segítségével scanf () függvényt, adja hozzá és nyomtassa ki az összeget.

Először mellékeltem a szükséges fejlécfájlokat a következő kódsorokkal.

#include
#include
#include
#include

Ban,-ben fő() függvény, meghatároztam a szükséges változókat.

int szám1, szám2, összeg;

Aztán kinyitottam a fájlt bemenet.txt csak olvasható módban (O_RDONLY) használni a nyisd ki() függvény és tárolta a fájlleírót a változóban input_fds.

int input_fds = nyitott ("./bemenet.txt ", O_RDONLY);

Miután megvan a fájlleíró a bemenet.txt fájlt, bemásoltam a fájlleírót a szokásos bemeneti fájlleíróba STDIN_FILENO (0) segítségével dup2 () funkció. Fájl fájlleírója bemenet.txt most az alapértelmezett stdin fájlleíró.

dup2 (input_fds, STDIN_FILENO)

Írhatnám a dup2 () az alábbiak szerint működik. Az eredmény ugyanaz lenne. STDIN_FILENO tartja az értéket 0, ami az értéke stdin fájlleíró.

dup2 (input_fds, 0)

Meg is néztem dup2 () hibák a következő sorokkal. Ha hiba lép fel, a program úgy van beállítva, hogy hibaüzenetet nyomtasson és kilépjen.

if (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("A fájlleíró nem másolható.");
kilépés (EXIT_FAILURE);

Akkor használtam scanf () 2 szám beolvasásához a bemenet.txt fájl.

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

Ezután hozzáadtam a számokat és kinyomtattam az összeget az alapértelmezett konzolra / terminálra stdout.

összeg = szám1 + szám2;
printf ("% d +% d =% d \ n", szám1, szám2, összeg);

Amint láthatja, a program futtatása után megkaptam a várt kimenetet.

2. példa:

Hozzon létre egy új C forrásfájlt 02_dup2.c és írja be a fájl következő kódsorait.

#include
#include
#include
#include
#include
#include
int main (érvénytelen)
int szám1, szám2, összeg;
int input_fds = nyitott ("./bemenet.txt ", O_RDONLY);
int output_fds = nyitott ("./Kimenet.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (output_fds, STDOUT_FILENO);
scanf ("% d% d", & number1, & number2);
összeg = szám1 + szám2;
printf ("% d +% d =% d \ n", szám1, szám2, összeg);
visszatér EXIT_SUCCESS;

Most hozzon létre egy új fájlt bemenet.txt ugyanabban a könyvtárban, és írja be a következő sorba.

15 41

Ebben a programban ugyanazt tettem, mint a 1. példa. Az egyetlen különbség az, hogy létrehoztam egy új fájlt Kimenet.txt és a kimenet fájlleíróját használta.txt, mint alapértelmezett stdout fájlleíró a dup2 () funkció. Most a printf () függvényt írjuk a Kimenet.txt fájl.

Létrehoztam egy új fájlt, és a fájlleírót itt tároltam output_fds változó.

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

Másoltam az output_fds fájlleírót az stdout fájlleíróba is. Az előre definiált állandót használtam STDOUT_FILENO.

dup2 (output_fds, STDOUT_FILENO);

STDOUT_FILENO tartalmazza az értéket 1 fájl alapértelmezett fájlleíró értéke stdout). Tehát a következőképpen írhatnám át a dup2 () függvényhívást. Ugyanezeket az eredményeket adná.

dup2 (output_fds, 1);

A program többi része ugyanaz. Amint láthatja, a program futtatása után nem nyomtat semmit a konzolra / terminálra.

De a program létrehozott egy új fájlt Kimenet.txt fájl.

Amint láthatja, a kimenetet a fájlba írja Kimenet.txt.

Ha az összes hibát (stderr) egy másik fájlba, akkor a fájlleírót is átmásolhatja ide stderr fájlleíró a következőképpen.

dup2 (error_fds, STDERR_FILENO);

Szóval, így használja a dup2 () rendszerhívás C-ben. Köszönjük, hogy elolvasta ezt a cikket.

OpenTTD bemutató
Az OpenTTD az egyik legnépszerűbb üzleti szimulációs játék. Ebben a játékban létre kell hoznia egy csodálatos szállítási vállalkozást. Azonban kezdete...
SuperTuxKart Linuxhoz
A SuperTuxKart egy nagyszerű cím, amelynek célja, hogy ingyenesen hozza el a Mario Kart élményét Linux rendszerén. Elég kihívást jelentő és szórakozta...
Csata a Wesnoth bemutatóért
A Battle for Wesnoth az egyik legnépszerűbb nyílt forráskódú stratégiai játék, amelyet jelenleg játszhatsz. Ez a játék nem csak nagyon hosszú ideje fe...