C Programiranje

dup2 Sistemski poziv u C

dup2 Sistemski poziv u C
The dup2 () sistemska funkcija koristi se za stvaranje kopije postojećeg deskriptora datoteke. U Linuxu postoje 3 standardna deskriptora datoteka. Oni su:

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:

#include

Za više informacija pogledajte man stranicu za dup2 () sa sljedećom naredbom:

$ čovjek dup2

Primjer 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 41

Glavni 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 41

U 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.

Kako pojačati FPS u Linuxu?
FPS je kratica Okviri u sekundi. Zadatak FPS-a je mjerenje broja sličica u reprodukcijama video zapisa ili igranim izvedbama. Jednostavnim riječima, b...
Najpopularnije laboratorijske igre Oculus App
Ako ste vlasnik slušalica Oculus, tada morate biti sigurni u bočno učitavanje. Bočno učitavanje postupak je instaliranja nehranjenog sadržaja na vaše ...
10 najboljih igara za igranje na Ubuntuu
Windows platforma bila je jedna od dominantnih platformi za igre zbog ogromnog postotka igara koje se danas razvijaju kako bi podržavale Windows. Može...