C Programiranje

dup2 sistemski klic v C

dup2 sistemski klic v C
The dup2 () sistemska funkcija se uporablja za ustvarjanje kopije obstoječega deskriptorja datoteke. V Linuxu obstajajo 3 standardni deskriptorji datotek. To so:

stdin: To je standardni deskriptor vhodne datoteke. Privzeto se uporablja za sprejem vhodov s terminala. scanf (), getc () itd funkcije uporablja stdin deskriptor datoteke, da sprejme uporabniške vnose. The stdin deskriptor datoteke je predstavljen tudi s številko 0.

stdout: To je standardni deskriptor izhodne datoteke. Privzeto se uporablja za tiskanje nečesa na konzolo / terminal. Pogosto uporabljena printf () funkcija uporablja stdout za tiskanje želenega izhoda na konzolo / terminal. The stdout deskriptor datoteke je predstavljen tudi s številko 1.

stderr: To je standardni deskriptor datoteke z napakami. Naredi enako kot stdout deskriptor datoteke. The stderr deskriptor datoteke se uporablja za tiskanje sporočil o napakah na konzoli / terminalu. Edina razlika je, če uporabljate stderr deskriptor datoteke za tiskanje sporočil o napakah in stdout deskriptor datoteke za tiskanje običajnih izhodov, nato jih lahko pozneje ločite. Sporočila o napakah lahko na primer preusmerite v datoteko in običajne izhode v konzolo ali drugo datoteko. The stderr deskriptor datoteke je predstavljen tudi s številko 2.

Razen teh treh deskriptorjev datotek lahko v C-ju ustvarite dodatne deskriptorje datotek. Če želite ustvariti nov deskriptor datoteke, lahko uporabite odprto() funkcija v C. The odprto() funkcija odpre novo datoteko, ustvari deskriptor datoteke za to datoteko in priloži drugo številko kot 0, 1, 2 v deskriptor datoteke.

Ko datoteko odprete s pomočjo odprto() funkcijo, lahko uporabite preberi () in piši () funkcija za branje in pisanje v novo ustvarjeni deskriptor datoteke.

Zdaj pa si predstavljajte situacijo, ko želite s pomočjo brati iz določene datoteke scanf () ali getc () funkcijo in s pomočjo printf () funkcijo. To ni privzeto vedenje datoteke scanf (), getc () in printf () funkcije, kot sem že razložil. Privzeto, scanf () in getc () funkcija uporablja stdin in printf () uporablja stdout in tem načinom ni mogoče naročiti, naj uporabljajo druge deskriptorje datotek. Če želite spremeniti to privzeto vedenje, morate zamenjati stdin in stdout deskriptorji datotek z vašimi želenimi deskriptorji datotek. To je tisto dup2 () sistemska funkcija deluje. The dup2 () funkcija kopira deskriptor datoteke v drug deskriptor datoteke.

sintaksa in vrnjena vrednost dup2 ():

Sintaksa dup2 () funkcija je:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () funkcija kopira old_file_descriptor v new_file_descriptor. Če je new_file_descriptor že obstaja, potem se samodejno zapre in nato old_file_descriptor je kopiran vanj.

O uspehu, dup2 () funkcija vrne novi deskriptor datoteke. Če pride do napake, dup2 () vrne -1.

The dup2 () funkcija je definirana v datoteki glave unistd.h.

Vključiti morate glavo unistd.h v izvorni datoteki C, da lahko uporabite datoteko dup2 () deluje na naslednji način:

#include

Za več informacij si oglejte man stran dup2 () z naslednjim ukazom:

$ man dup2

Primer 1:

Ustvarite novo izvorno datoteko C 01_dup2.c in v datoteko vnesite naslednje vrstice kod.

#include
#include
#include
#include
 
int main (void)
int število1, število2, vsota;
 
int input_fds = odprto ("./ vhod.txt ", O_RDONLY);
 
če (dup2 (input_fds, STDIN_FILENO)) < 0)
printf ("Ni mogoče podvojiti deskriptorja datoteke.");
izhod (EXIT_FAILURE);

 
scanf ("% d% d", & number1, & number2);
 
vsota = število1 + število2;
 
printf ("% d +% d =% d \ n", število1, število2, vsota);
 
vrni EXIT_SUCCESS;

Zdaj ustvarite novo datoteko vhod.txt v isti imenik in vanj vnesite naslednjo vrstico.

15 41

Glavni cilj tega programa je prebrati 2 celoštevilki iz vhod.txt datoteko scanf () funkcijo, jih dodajte in natisnite vsoto.

Najprej sem vključil zahtevane datoteke z naslednjimi vrsticami kod.

#include
#include
#include
#include

V glavni () funkcijo, sem določil zahtevane spremenljivke.

int število1, število2, vsota;

Nato sem odprl datoteko vhod.txt v načinu samo za branje (O_RDONLY) uporabljati odprto() funkcijo in je v spremenljivko shranil deskriptor datoteke input_fds.

int input_fds = odprto ("./ vhod.txt ", O_RDONLY);

Ko dobim deskriptor datoteke vhod.txt datoteko, skopiral sem deskriptor datoteke v standardni deskriptor vhodne datoteke STDIN_FILENO (0) z uporabo dup2 () funkcijo. Deskriptor datoteke vhod.txt je zdaj privzeta stdin deskriptor datoteke.

dup2 (input_fds, STDIN_FILENO)

Lahko bi tudi napisal dup2 () deluje na naslednji način. Rezultat bi bil enak. STDIN_FILENO ima vrednost 0, kar je vrednost stdin deskriptor datoteke.

dup2 (input_fds, 0)

Preveril sem tudi dup2 () napake v naslednjih vrsticah. Če pride do napake, je program nastavljen tako, da natisne sporočilo o napaki in izstopi.

če (dup2 (input_fds, STDIN_FILENO)) < 0)
printf ("Ni mogoče podvojiti deskriptorja datoteke.");
izhod (EXIT_FAILURE);

Potem sem uporabil scanf () za skeniranje 2 številk iz vhod.txt mapa.

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

Nato sem dodal številke in vsoto natisnil na konzolo / terminal, privzeto stdout.

vsota = število1 + število2;
printf ("% d +% d =% d \ n", število1, število2, vsota);

Kot lahko vidite, sem po zagonu programa dobil pričakovane rezultate.

2. primer:

Ustvarite novo izvorno datoteko C 02_dup2.c in v datoteko vnesite naslednje vrstice kod.

#include
#include
#include
#include
#include
#include
int main (void)
int število1, število2, vsota;
int input_fds = odprto ("./ vhod.txt ", O_RDONLY);
int output_fds = odprto ("./ izhod.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (output_fds, STDOUT_FILENO);
scanf ("% d% d", & number1, & number2);
vsota = število1 + število2;
printf ("% d +% d =% d \ n", število1, število2, vsota);
vrni EXIT_SUCCESS;

Zdaj ustvarite novo datoteko vhod.txt v isti imenik in vanj vnesite naslednjo vrstico.

15 41

V tem programu sem naredil isto kot v Primer 1. Edina razlika je v tem, da sem ustvaril novo datoteko izhod.txt in uporabil datotečni deskriptor izhoda.txt kot privzeto stdout deskriptor datoteke z uporabo dup2 () funkcijo. Zdaj so vsi izhodni podatki printf () funkcija bo zapisana v izhod.txt mapa.

Ustvaril sem novo datoteko in deskriptor datoteke shranil v output_fds spremenljivka.

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

Prav tako sem kopiral deskriptor datoteke output_fds v deskriptor datoteke stdout. Uporabil sem vnaprej določeno konstanto STDOUT_FILENO.

dup2 (output_fds, STDOUT_FILENO);

STDOUT_FILENO vsebuje vrednost 1 (privzeta vrednost deskriptorja datoteke stdout). Torej, klic funkcije dup2 () bi lahko prepisal na naslednji način. To bi dalo enake rezultate.

dup2 (output_fds, 1);

Preostali del programa je enak. Kot lahko vidite, ko zaženem program, na konzolo / terminal ne natisne ničesar.

Toda program je ustvaril novo datoteko izhod.txt mapa.

Kot lahko vidite, je izhod zapisan v datoteko izhod.txt.

Če želite napisati vse napake (stderr) v drugo datoteko, nato pa lahko tudi kopirate deskriptor datoteke v stderr deskriptor datoteke, kot sledi.

dup2 (error_fds, STDERR_FILENO);

Torej, tako uporabljate dup2 () sistemski klic v C. Hvala, ker ste prebrali ta članek.

Najboljših 5 izdelkov z ergonomsko računalniško miško za Linux
Ali dolgotrajna uporaba računalnika povzroča bolečine v zapestju ali prstih? Ali imate trde sklepe in bi se morali neprestano tresti z rokami? Ali čut...
How to Change Mouse and Touchpad Settings Using Xinput in Linux
Most Linux distributions ship with “libinput” library by default to handle input events on a system. It can process input events on both Wayland and X...
S pomočjo gumba X-Mouse Button Control različno prilagodite gumbe miške za različno programsko opremo
Mogoče potrebujete orodje, ki bi lahko spremenilo nadzor miške z vsako aplikacijo, ki jo uporabljate. V tem primeru lahko preizkusite aplikacijo z ime...