C Programování

dup2 Systémové volání v C

dup2 Systémové volání v C
The dup2 () funkce systému se používá k vytvoření kopie existujícího deskriptoru souboru. V systému Linux existují 3 standardní deskriptory souborů. Oni jsou:

stdin: Toto je standardní deskriptor vstupního souboru. Ve výchozím nastavení se používá k převzetí vstupu z terminálu. scanf (), getc () funkce atd stdin deskriptor souboru pro přijímání uživatelských vstupů. The stdin deskriptor souboru je také reprezentován číslem 0.

stdout: Toto je standardní deskriptor výstupních souborů. Ve výchozím nastavení se používá k tisku něčeho na konzolu / terminál. Široce používané printf () funkce používá stdout vytisknete požadovaný výstup na konzolu / terminál. The stdout deskriptor souboru je také reprezentován číslem 1.

stderr: Toto je standardní deskriptor souborů chyb. Dělá totéž jako stdout deskriptor souboru. The stderr deskriptor souboru se používá k tisku chybových zpráv na konzole / terminálu. Jediný rozdíl je, pokud používáte stderr - deskriptor souboru pro tisk chybových zpráv a - stdout deskriptor souborů pro tisk normálních výstupů, které pak můžete později oddělit. Chybové zprávy můžete například přesměrovat do souboru a normální výstupy do konzoly nebo jiného souboru. The stderr deskriptor souboru je také reprezentován číslem 2.

Kromě těchto 3 deskriptorů souborů můžete v C vytvořit další deskriptory souborů. Chcete-li vytvořit nový deskriptor souborů, můžete použít otevřeno() funkce v C. The otevřeno() funkce otevře nový soubor, vytvoří pro tento soubor deskriptor souboru a připojí jiné číslo než 0, 1, 2 do deskriptoru souboru.

Jakmile otevřete soubor pomocí otevřeno() funkci, můžete použít číst() a napsat() funkce pro čtení a zápis do nově vytvořeného deskriptoru souboru.

Nyní si představte situaci, kdy chcete číst z konkrétního souboru pomocí scanf () nebo getc () funkce a zápis do jiného souboru pomocí printf () funkce. Toto není výchozí chování scanf (), getc () a printf () funkce, jak jsem vysvětlil dříve. Ve výchozím stavu, scanf () a getc () funkce používá stdin a printf () používá stdout a neexistuje žádný způsob, jak říct těmto funkcím, aby používaly jiné deskriptory souborů. Chcete-li změnit toto výchozí chování, musíte nahradit stdin a stdout deskriptory souborů s požadovanými deskriptory souborů. To je to, co dup2 () funkce systému ano. The dup2 () funkce zkopíruje deskriptor souboru do jiného deskriptoru souboru.

dup2 () Syntaxe a návratová hodnota:

Syntaxe dup2 () funkce je:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () funkce kopíruje old_file_descriptor do deskriptor nového_souboru. Pokud deskriptor nového_souboru již existuje, pak se automaticky zavře a poté old_file_descriptor je do ní zkopírován.

O úspěchu dup2 () funkce vrací nový deskriptor souboru. Pokud dojde k chybě, dup2 () se vrací -1.

The dup2 () funkce je definována v hlavičkovém souboru unistd.h.

Musíte zahrnout záhlaví unistd.h ve zdrojovém souboru C, abyste mohli používat dup2 () funkce takto:

#zahrnout

Další informace najdete na manuálové stránce dup2 () s následujícím příkazem:

$ muž dup2

Příklad 1:

Vytvořte nový zdrojový soubor C 01_dup2.C a zadejte do souboru následující řádky kódů.

#zahrnout
#zahrnout
#zahrnout
#zahrnout
 
int main (void)
int číslo1, číslo2, součet;
 
int input_fds = open ("./vstup.txt ", O_RDONLY);
 
if (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Nelze duplikovat deskriptor souboru.");
exit (EXIT_FAILURE);

 
scanf ("% d% d", & číslo1, & číslo2);
 
součet = číslo1 + číslo2;
 
printf ("% d +% d =% d \ n", číslo1, číslo2, součet);
 
vrátit EXIT_SUCCESS;

Nyní vytvořte nový soubor vstup.txt ve stejném adresáři a zadejte do něj následující řádek.

15 41

Hlavním cílem tohoto programu je načíst 2 celočíselná čísla z vstup.txt soubor pomocí scanf () funkce, přidejte je a vytiskněte součet.

Nejprve jsem vložil požadované hlavičkové soubory do následujících řádků kódů.

#zahrnout
#zahrnout
#zahrnout
#zahrnout

V hlavní() funkce, definoval jsem požadované proměnné.

int číslo1, číslo2, součet;

Poté jsem soubor otevřel vstup.txt v režimu pouze pro čtení (O_RDONLY) za použití otevřeno() funkce a uložil deskriptor souboru do proměnné input_fds.

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

Jakmile budu mít deskriptor souborů vstup.txt soubor, zkopíroval jsem deskriptor souboru do standardního deskriptoru vstupního souboru STDIN_FILENO (0) pomocí dup2 () funkce. Deskriptor souboru vstup.txt je nyní výchozí stdin deskriptor souboru.

dup2 (input_fds, STDIN_FILENO)

Mohl bych také napsat dup2 () fungují následovně. Výsledek by byl stejný. STDIN_FILENO drží hodnotu 0, což je hodnota stdin deskriptor souboru.

dup2 (input_fds, 0)

Také jsem zkontroloval dup2 () chyby s následujícími řádky. Pokud dojde k chybě, program je nastaven na tisk chybové zprávy a ukončení.

if (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Nelze duplikovat deskriptor souboru.");
exit (EXIT_FAILURE);

Pak jsem použil scanf () skenovat 2 čísla z vstup.txt soubor.

scanf ("% d% d", & číslo1, & číslo2);

Poté jsem přidal čísla a vytiskl součet na konzolu / terminál, výchozí stdout.

součet = číslo1 + číslo2;
printf ("% d +% d =% d \ n", číslo1, číslo2, součet);

Jak vidíte, dostal jsem očekávaný výstup, jakmile spustím program.

Příklad 2:

Vytvořte nový zdrojový soubor C 02_dup2.C a zadejte do souboru následující řádky kódů.

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
int main (void)
int číslo1, číslo2, součet;
int input_fds = open ("./vstup.txt ", O_RDONLY);
int output_fds = open ("./výstup.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (output_fds, STDOUT_FILENO);
scanf ("% d% d", & číslo1, & číslo2);
součet = číslo1 + číslo2;
printf ("% d +% d =% d \ n", číslo1, číslo2, součet);
vrátit EXIT_SUCCESS;

Nyní vytvořte nový soubor vstup.txt ve stejném adresáři a zadejte do něj následující řádek.

15 41

V tomto programu jsem udělal to samé jako v Příklad 1. Jediný rozdíl je v tom, že jsem vytvořil nový soubor výstup.txt a použil deskriptor souboru výstupu.txt jako výchozí stdout deskriptor souborů pomocí dup2 () funkce. Nyní je veškerý výstup souboru printf () funkce bude zapsána do výstup.txt soubor.

Vytvořil jsem nový soubor a uložil deskriptor souboru dovnitř output_fds proměnná.

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

Také jsem zkopíroval deskriptor souboru output_fds do deskriptoru standardního souboru. Použil jsem předdefinovanou konstantu STDOUT_FILENO.

dup2 (output_fds, STDOUT_FILENO);

STDOUT_FILENO obsahuje hodnotu 1 (výchozí hodnota deskriptoru souboru stdout). Takže bych mohl přepsat volání funkce dup2 () následovně. Dalo by to stejné výsledky.

dup2 (output_fds, 1);

Zbytek programu je stejný. Jak vidíte, po spuštění programu se na konzole / terminálu nic nevytiskne.

Program ale vytvořil nový soubor výstup.txt soubor.

Jak vidíte, výstup se zapíše do souboru výstup.txt.

Pokud chcete zapsat všechny chyby (stderr) do jiného souboru, můžete také zkopírovat deskriptor souboru do stderr deskriptor souboru následujícím způsobem.

dup2 (error_fds, STDERR_FILENO);

Takto tedy používáte dup2 () systémové volání v C. Děkujeme za přečtení tohoto článku.

Hry Nejlepší linuxové distribuce pro hraní her v roce 2021
Nejlepší linuxové distribuce pro hraní her v roce 2021
Operační systém Linux má za sebou dlouhou cestu od svého původního, jednoduchého vzhledu založeného na serveru. Tento OS se v posledních letech nesmír...
Hry Jak zachytit a streamovat vaši herní relaci v systému Linux
Jak zachytit a streamovat vaši herní relaci v systému Linux
V minulosti bylo hraní her považováno pouze za koníček, ale postupem času došlo v herním průmyslu k obrovskému nárůstu z hlediska technologie a počtu ...
Hry Nejlepší hry pro ruční sledování
Nejlepší hry pro ruční sledování
Oculus Quest nedávno představil skvělou myšlenku ručního sledování bez ovladačů. S neustále se zvyšujícím počtem her a aktivit, které provádějí podpor...