stdin: Ovo je standardni deskriptor ulazne datoteke. Prema zadanim postavkama koristi se za unos podataka s terminala. scanf (), getc () itd. funkcije koristi stdin deskriptor datoteke za preuzimanje korisničkih unosa. The stdin deskriptor datoteke također je predstavljen brojem 0.
stdout: Ovo je standardni deskriptor izlazne datoteke. Zadano se koristi za ispis nečega na konzolu / terminal. Široko korištena printf () funkcija koristi stdout za ispis željenog izlaza na konzolu / terminal. The stdout deskriptor datoteke također je predstavljen brojem 1.
stderr: Ovo je standardni deskriptor datoteke pogreške. Radi istu stvar kao i stdout deskriptor datoteke. The stderr deskriptor datoteke koristi se za ispis poruka o pogreškama na konzoli / terminalu. Jedina je razlika ako koristite stderr deskriptor datoteke za ispis poruka o pogreškama i stdout deskriptor datoteke za ispis normalnih izlaza, a zatim ih možete kasnije razdvojiti. Na primjer, poruke greške možete preusmjeriti u datoteku, a normalne izlaze na konzolu ili drugu datoteku. The stderr deskriptor datoteke također je predstavljen brojem 2.
Osim ova 3 deskriptora datoteka, u C možete stvoriti dodatne deskriptore datoteka. Da biste stvorili novi deskriptor datoteke, možete koristiti otvorena() funkcija u C. The otvorena() funkcija otvara novu datoteku, stvara deskriptor datoteke za tu datoteku i pridružuje broj koji nije 0, 1, 2 na deskriptor datoteke.
Jednom kada otvorite datoteku pomoću otvorena() funkciju, možete koristiti čitati() i pisati() funkcija za čitanje i pisanje u novostvoreni deskriptor datoteke.
Sada zamislite situaciju u kojoj želite čitati iz određene datoteke pomoću scanf () ili getc () funkciju i zapis u drugu datoteku pomoću printf () funkcija. Ovo nije zadano ponašanje datoteke scanf (), getc () i printf () funkcije kao što sam ranije objasnio. Prema zadanim postavkama, scanf () i getc () funkcija koristi stdin i printf () koristi stdout i ne postoji način da se tim funkcijama naredi da koriste druge deskriptore datoteka. Dakle, da biste promijenili ovo zadano ponašanje, morate zamijeniti stdin i stdout deskriptori datoteka sa vašim željenim deskriptorima datoteka. To je ono što dup2 () funkcija sustava radi. The dup2 () funkcija kopira deskriptor datoteke u drugi deskriptor datoteke.
sintaksa i povratna vrijednost dup2 ():
Sintaksa dup2 () funkcija je:
int dup2 (int stari_detektor_datoteke, int novi_detektor_datoteke);dup2 () funkcija kopira stari_detektor_datoteke u novi_detektor_datoteke. Ako je novi_detektor_datoteke već postoji, zatim se automatski zatvara, a zatim stari_detektor_datoteke se kopira na njega.
O uspjehu, dup2 () funkcija vraća novi deskriptor datoteke. Ako se dogodi pogreška, dup2 () vraća se -1.
The dup2 () funkcija definirana je u zaglavnoj datoteci unistd.h.
Morate uključiti zaglavlje unistd.h u vašoj C izvornoj datoteci kako biste koristili dup2 () funkcioniraju na sljedeći način:
#includeZa više informacija pogledajte man stranicu za dup2 () sa sljedećom naredbom:
$ čovjek dup2Primjer 1:
Stvorite novu izvornu datoteku C 01_dup2.c i u datoteku unesite sljedeće retke kodova.
#include#include
#include
#include
int main (void)
int broj1, broj2, zbroj;
int input_fds = open ("./ulazni.txt ", O_RDONLY);
if (dup2 (input_fds, STDIN_FILENO)) < 0)
printf ("Nije moguće duplicirati deskriptor datoteke.");
izlaz (EXIT_FAILURE);
scanf ("% d% d", & broj1, & broj2);
zbroj = broj1 + broj2;
printf ("% d +% d =% d \ n", broj1, broj2, zbroj);
povratak EXIT_SUCCESS;
Sada stvorite novu datoteku ulazni.txt u isti direktorij i u njega unesite sljedeći redak.
15 41Glavni cilj ovog programa je očitavanje 2 cijela broja iz programa ulazni.txt datoteka pomoću scanf () funkcije, dodajte ih i ispišite zbroj.
Prvo, uključio sam potrebne datoteke zaglavlja sa sljedećim redovima kodova.
#include#include
#include
#include
U glavni() funkcije, definirao sam potrebne varijable.
int broj1, broj2, zbroj;Tada sam otvorio datoteku ulazni.txt u načinu samo za čitanje (O_RDONLY) koristiti otvorena() funkciju i spremili deskriptor datoteke u varijablu ulazni_fds.
int input_fds = open ("./ulazni.txt ", O_RDONLY);Jednom kad dobijem deskriptor datoteke ulazni.txt datoteku, kopirao sam deskriptor datoteke u standardni deskriptor ulazne datoteke STDIN_FILENO (0) pomoću dup2 () funkcija. Deskriptor datoteke ulazni.txt je sada zadana vrijednost stdin deskriptor datoteke.
dup2 (input_fds, STDIN_FILENO)Također bih mogao napisati dup2 () funkcioniraju na sljedeći način. Rezultat bi bio isti. STDIN_FILENO drži vrijednost 0, što je vrijednost stdin deskriptor datoteke.
dup2 (input_fds, 0)Također sam provjerio dup2 () pogreške u sljedećim redovima. Ako se pogreška dogodi, program je postavljen za ispis poruke o pogrešci i izlazak.
if (dup2 (input_fds, STDIN_FILENO)) < 0)printf ("Nije moguće duplicirati deskriptor datoteke.");
izlaz (EXIT_FAILURE);
Tada sam koristio scanf () za skeniranje 2 broja iz ulazni.txt datoteka.
scanf ("% d% d", & broj1, & broj2);Zatim sam dodao brojeve i zbroj otisnuo na konzolu / terminal, što je zadano stdout.
zbroj = broj1 + broj2;printf ("% d +% d =% d \ n", broj1, broj2, zbroj);
Kao što vidite, dobio sam očekivani izlaz nakon što pokrenem program.
Primjer 2:
Stvorite novu izvornu datoteku C 02_dup2.c i u datoteku unesite sljedeće retke kodova.
#include#include
#include
#include
#include
#include
int main (void)
int broj1, broj2, zbroj;
int input_fds = open ("./ulazni.txt ", O_RDONLY);
int output_fds = open ("./izlaz.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (output_fds, STDOUT_FILENO);
scanf ("% d% d", & broj1, & broj2);
zbroj = broj1 + broj2;
printf ("% d +% d =% d \ n", broj1, broj2, zbroj);
povratak EXIT_SUCCESS;
Sada stvorite novu datoteku ulazni.txt u isti direktorij i u njega unesite sljedeći redak.
15 41U ovom programu radio sam isto što i u programu Primjer 1. Jedina je razlika što sam stvorio novu datoteku izlaz.txt i koristio je deskriptor datoteke izlaza.txt kao zadani stdout deskriptor datoteke pomoću dup2 () funkcija. Sad, sav izlaz iz printf () funkcija bit će zapisana u izlaz.txt datoteka.
Stvorio sam novu datoteku i spremio deskriptor datoteke u izlazni_fds varijabilna.
int output_fds = open ("./izlaz.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);Također sam kopirao deskriptor datoteke output_fds u deskriptor datoteke stdout. Koristio sam unaprijed definiranu konstantu STDOUT_FILENO.
dup2 (output_fds, STDOUT_FILENO);STDOUT_FILENO sadrži vrijednost 1 (zadana vrijednost deskriptora datoteke stdout). Dakle, mogao bih prepisati poziv funkcije dup2 () na sljedeći način. Dalo bi iste rezultate.
dup2 (output_fds, 1);Ostatak programa je isti. Kao što vidite, nakon što pokrenem program, on ne ispisuje ništa na konzoli / terminalu.
Ali, program je stvorio novu datoteku izlaz.txt datoteka.
Kao što vidite, izlaz se zapisuje u datoteku izlaz.txt.
Ako želite napisati sve pogreške (stderr) u drugu datoteku, a zatim također možete kopirati deskriptor datoteke u stderr deskriptor datoteke kako slijedi.
dup2 (error_fds, STDERR_FILENO);Dakle, na taj način koristite dup2 () sistemski poziv u C. Hvala što ste pročitali ovaj članak.