C Programmeerimine

dup2 süsteemikõne C-s

dup2 süsteemikõne C-s
The dup2 () süsteemi funktsiooni kasutatakse olemasoleva failikirjeldaja koopia loomiseks. Linuxis on 3 standardset failikirjeldajat. Nemad on:

stdin: See on standardne sisendfailide kirjeldaja. Seda kasutatakse vaikimisi terminalist sisendi võtmiseks. scanf (), getc () jne funktsioonid kasutavad stdin faili kirjeldaja kasutaja sisendite võtmiseks. The stdin faili kirjeldajat tähistab ka number 0.

stdout: See on standardne väljundfailide kirjeldaja. Seda kasutatakse vaikimisi konsooli / terminali millegi printimiseks. Laialdaselt kasutatav printf () funktsioon kasutab stdout soovitud väljundi konsooli / terminali printimiseks. The stdout faili kirjeldajat tähistab ka number 1.

stderr: See on tavaline veafailide kirjeldaja. Ta teeb sama asja nagu stdout faili kirjeldaja. The stderr failikirjeldajat kasutatakse veateadete printimiseks konsoolile / terminalile. Ainus erinevus on see, kui kasutate stderr failikirjur veateadete printimiseks ja stdout failide kirjeldaja tavaliste väljundite printimiseks, siis saate need hiljem eraldada. Näiteks saate veateateid faili ümber suunata ja tavalised väljundid konsooli või mõnda muusse faili. The stderr faili kirjeldajat tähistab ka number 2.

Peale nende kolme failikirjeldaja saate C-s luua täiendavaid failikirjeldajaid. Uue failikirjuri loomiseks võite kasutada avatud () funktsioon C-s. The avatud () funktsioon avab uue faili, loob selle faili kirjeldaja ja lisab muu numbri peale 0, 1, 2 failikirjeldaja juurde.

Kui olete faili avanud, kasutades avatud () funktsiooni, saate kasutada loe () ja kirjutama () funktsioon äsja loodud failikirjeldaja lugemiseks ja kirjutamiseks.

Kujutage nüüd ette olukorda, kus soovite konkreetsest failist lugeda scanf () või getc () funktsiooni ja kirjutage teise faili kasutades printf () funktsioon. See pole ettevõtte vaikekäitumine scanf (), getc () ja printf () toimib nii, nagu ma varem selgitasin. Algselt, scanf () ja getc () funktsioon kasutab stdin ja printf () kasutab stdout ja pole mingit võimalust öelda neile funktsioonidele teiste failikirjeldajate kasutamist. Selle vaikekäitumise muutmiseks peate selle asendama stdin ja stdout failikirjeldajad koos soovitud failikirjeldajatega. See on see, mida dup2 () süsteemi funktsioon teeb. The dup2 () function kopeerib failikirjuri teise failikirjeldajaks.

dup2 () süntaks ja tagastusväärtus:

Süntaks dup2 () funktsioon on:

int dup2 (int vana_faili_kirjur, int uus_faili_kirjur);

dup2 () funktsioon kopeerib old_file_descriptor sisse new_file_descriptor. Kui new_file_descriptor on juba olemas, siis see suletakse automaatselt ja seejärel old_file_descriptor on sinna kopeeritud.

Edu saavutamisel on dup2 () funktsioon tagastab uue failikirjeldaja. Vea ilmnemisel, dup2 () naaseb -1.

The dup2 () funktsioon on määratletud päisefailis unistd.h.

Peate lisama päise unistd.h faili kasutamiseks C-lähtekoodis dup2 () toimivad järgmiselt:

# kaasata

Lisateavet leiate lehelt dup2 () järgmise käsuga:

$ mees dup2

Näide 1:

Looge uus C lähtefail 01_dup2.c ja tippige faili järgmised koodiread.

# kaasata
# kaasata
# kaasata
# kaasata
 
int main (tühine)
int number1, arv2, summa;
 
int input_fds = avatud ("./sisend.txt ", O_RDONLY);
 
kui (dup2 (sisend_fds, STDIN_FILENO) < 0)
printf ("Failikirjeldajat ei saa kopeerida.");
väljumine (EXIT_FAILURE);

 
scanf ("% d% d", & number1 ja number2);
 
summa = arv1 + arv2;
 
printf ("% d +% d =% d \ n", number1, number2, summa);
 
tagastage EXIT_SUCCESS;

Nüüd looge uus fail sisend.txt samasse kataloogi ja tippige selle järgmine rida.

15 41

Selle programmi peamine eesmärk on lugeda 2 täisarvu sisend.txt faili kasutades scanf () funktsioon, lisage need ja printige summa.

Esiteks lisasin vajalikud päisefailid järgmiste koodiridadega.

# kaasata
# kaasata
# kaasata
# kaasata

Aastal peamine () funktsiooni määratlesin vajalikud muutujad.

int number1, arv2, summa;

Seejärel avasin faili sisend.txt kirjutuskaitstud režiimis (O_RDONLY) kasutades avatud () funktsioon ja salvestas failikirjeldaja muutujasse sisend_fds.

int input_fds = avatud ("./sisend.txt ", O_RDONLY);

Kui mul on faili kirjeldaja sisend.txt faili, kopeerisin faili kirjeldaja standardsesse sisendfaili kirjeldusse STDIN_FILENO (0) kasutades dup2 () funktsioon. Faili kirjeldaja sisend.txt on nüüd vaikimisi stdin faili kirjeldaja.

dup2 (sisend_fds, STDIN_FILENO)

Ma võiksin ka kirjutada dup2 () toimivad järgmiselt. Tulemus oleks sama. STDIN_FILENO omab väärtust 0, mis on väärtus stdin faili kirjeldaja.

dup2 (sisend_fds, 0)

Kontrollisin ka dup2 () järgmiste ridade vead. Vea ilmnemisel on programm seatud veateate printimiseks ja väljumiseks.

kui (dup2 (sisend_fds, STDIN_FILENO) < 0)
printf ("Failikirjeldajat ei saa dubleerida.");
väljumine (EXIT_FAILURE);

Siis ma kasutasin scanf () 2 numbri skannimiseks sisend.txt faili.

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

Seejärel lisasin numbrid ja printisin summa vaikimisi konsoolile / terminalile stdout.

summa = arv1 + arv2;
printf ("% d +% d =% d \ n", number1, number2, summa);

Nagu näete, sain programmi käivitamisel oodatud väljundi.

Näide 2:

Looge uus C lähtefail 02_dup2.c ja tippige faili järgmised koodiread.

# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
int main (tühine)
int number1, arv2, summa;
int input_fds = avatud ("./sisend.txt ", O_RDONLY);
int output_fds = avatud ("./ väljund.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (sisend_fds, STDIN_FILENO);
dup2 (väljund_fds, STDOUT_FILENO);
scanf ("% d% d", & number1 ja number2);
summa = arv1 + arv2;
printf ("% d +% d =% d \ n", number1, number2, summa);
tagastage EXIT_SUCCESS;

Nüüd looge uus fail sisend.txt samasse kataloogi ja tippige selle järgmine rida.

15 41

Selles programmis tegin sama, mis aastal Näide 1. Ainus erinevus on see, et lõin uue faili väljund.txt ja kasutas väljundi failikirjeldajat.Vaikimisi txt stdout faili kirjeldaja, kasutades dup2 () funktsioon. Nüüd kogu faili väljund printf () funktsioon kirjutatakse väljund.txt faili.

Lõin uue faili ja talletasin faili kirjeldaja väljund_fds muutuv.

int output_fds = avatud ("./ väljund.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

Kopeerisin faili deskriptori output_fds ka stdout failikirjeldisse. Kasutasin etteantud konstanti STDOUT_FILENO.

dup2 (väljund_fds, STDOUT_FILENO);

STDOUT_FILENO sisaldab väärtust 1 (faili vaikekirjeldaja vaikeväärtus stdout). Niisiis, ma saaksin dup2 () funktsioonikõne ümber kirjutada järgmiselt. See annaks samad tulemused.

dup2 (väljund_fds, 1);

Ülejäänud programm on sama. Nagu näete, ei trüki programm pärast käivitamist konsoolile / terminalile midagi.

Kuid programm lõi uue faili väljund.txt faili.

Nagu näete, kirjutatakse väljund faili väljund.txt.

Kui soovite kirjutada kõik vead (stderr) teise faili, siis saate failikirjeldaja ka kopeerida stderr failikirjeldaja järgmiselt.

dup2 (vea_fds, STDERR_FILENO);

Nii kasutate seda dup2 () süsteemi kõne C-s. Täname selle artikli lugemise eest.

Installige Linuxile uusim Dolphin Emulator for Gamecube & Wii
Dolphini emulaator võimaldab teil mängida valitud Gamecube & Wii mänge Linuxi personaalarvutites (PC). Vabalt saadaval oleva ja avatud lähtekoodiga m...
Kuidas kasutada GameConquerori petumootorit Linuxis
Artikkel sisaldab juhendit GameConquerori petumootori kasutamise kohta Linuxis. Paljud kasutajad, kes mängivad Windowsis mänge, kasutavad rakendust „C...
Parimad Linuxi mängukonsooli emulaatorid
Selles artiklis loetletakse Linuxi jaoks saadaval olev populaarne mängukonsooli emuleerimise tarkvara. Emuleerimine on tarkvara ühilduvuse kiht, mis j...