C programavimas

„dup2“ sistemos skambutis C

„dup2“ sistemos skambutis C
The dup2 () sistemos funkcija naudojama kuriant esamo failo aprašo kopiją. „Linux“ yra 3 standartiniai failų aprašai. Jie yra:

stdin: Tai yra standartinis įvesties failo aprašas. Pagal numatytuosius nustatymus jis naudojamas priimant duomenis iš terminalo. scanf (), getc () tt funkcijos naudoja stdin failo aprašas, skirtas vartotojo įvestims. The stdin failo aprašą taip pat nurodo skaičius 0.

stdout: Tai yra standartinis išvesties failo aprašas. Pagal numatytuosius nustatymus jis naudojamas kažkam atsispausdinti į konsolę / terminalą. Plačiai naudojamas printf () funkcija naudoja stdout norėdami išspausdinti norimą išvestį į konsolę / terminalą. The stdout failo aprašą taip pat nurodo skaičius 1.

stderr: Tai yra standartinis klaidos failo aprašas. Tai daro tą patį, ką ir stdout bylos aprašas. The stderr failo deskriptorius naudojamas spausdinti klaidos pranešimus konsolėje / terminale. Vienintelis skirtumas yra tai, ar jūs naudojate stderr failo deskriptorius, skirtas atspausdinti klaidos pranešimus, ir stdout failo aprašą, kad atspausdintumėte įprastus išvestis, tada vėliau galėsite juos atskirti. Pavyzdžiui, galite peradresuoti klaidos pranešimus į failą, o įprastus išvestis į konsolę ar kitą failą. The stderr failo aprašą taip pat nurodo skaičius 2.

C, išskyrus šiuos 3 failų aprašus, galite sukurti papildomus failų aprašus. Norėdami sukurti naują failo aprašą, galite naudoti atviras() funkcija C. The atviras() funkcija atidaro naują failą, sukuria failo aprašą ir prideda kitą numerį nei 0, 1, 2 į bylos aprašą.

Kai atidarysite failą naudodami atviras() funkciją, galite naudoti skaityti () ir rašyti () funkcija skaityti ir rašyti naujai sukurtą failo deskriptorių.

Dabar įsivaizduokite situaciją, kai norite skaityti iš konkretaus failo naudodami scanf () arba getc () funkciją ir rašykite į kitą failą naudodami printf () funkcija. Tai nėra numatytasis scanf (), getc () ir printf () funkcijos, kaip aš paaiškinau anksčiau. Pagal numatytuosius nustatymus, scanf () ir getc () funkcija naudoja stdin ir printf () naudoja stdout ir jokiu būdu negalima nurodyti šioms funkcijoms naudoti kitus failų aprašus. Taigi, norėdami pakeisti šį numatytąjį elgesį, turite pakeisti stdin ir stdout failų aprašai su norimais failų aprašais. Tai yra dup2 () sistemos funkcija daro. The dup2 () funkcija nukopijuoja failo aprašą į kitą failo deskriptorių.

dup2 () sintaksė ir grąžinimo vertė:

Sintaksė dup2 () funkcija yra:

int dup2 (int senas_failo_descriptoras, int naujas_failo_ deskriptorius);

dup2 () funkcija nukopijuoja old_file_descriptor į new_file_descriptor. Jei new_file_descriptor jau egzistuoja, tada jis automatiškai uždaromas ir tada old_file_descriptor yra nukopijuotas į jį.

Dėl sėkmės dup2 () funkcija grąžina naują failo aprašą. Jei įvyksta klaida, dup2 () grįžta -1.

The dup2 () funkcija yra apibrėžta antraštės faile unistd.h.

Turite įtraukti antraštę unistd.h C šaltinio faile, kad galėtumėte naudoti dup2 () veikia taip:

# įtraukti

Norėdami gauti daugiau informacijos, žr dup2 () su tokia komanda:

$ man dup2

1 pavyzdys:

Sukurkite naują C šaltinio failą 01_dup2.c ir įveskite toliau nurodytas failo kodų eilutes.

# įtraukti
# įtraukti
# įtraukti
# įtraukti
 
int main (negaliojantis)
int skaičius1, skaičius2, suma;
 
int input_fds = atidaryti ("./ įvestis.txt ", O_RDONLY);
 
jei (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Nepavyko nukopijuoti failo aprašo.");
išėjimas (EXIT_FAILURE);

 
scanf ("% d% d", & number1, & number2);
 
suma = skaičius1 + skaičius2;
 
printf ("% d +% d =% d \ n", skaičius1, skaičius2, suma);
 
grąžinti EXIT_SUCCESS;

Dabar sukurkite naują failą įvestis.txt tame pačiame kataloge ir įveskite sekančią jo eilutę.

15 41

Pagrindinis šios programos tikslas yra nuskaityti 2 sveikus skaičius iš įvestis.txt failą naudodami scanf () funkciją, pridėkite juos ir atspausdinkite sumą.

Pirmiausia įtraukiau reikiamus antraštės failus su šiomis kodų eilutėmis.

# įtraukti
# įtraukti
# įtraukti
# įtraukti

Viduje konors pagrindinis () funkciją, aš apibrėžiau reikiamus kintamuosius.

int skaičius1, skaičius2, suma;

Tada atidariau failą įvestis.txt tik skaitymo režimu (O_RDONLY) naudojant atviras() funkciją ir failo aprašą išsaugojo kintamajame įvesties_fd.

int input_fds = atidaryti ("./ įvestis.txt ", O_RDONLY);

Kai aš turiu failo aprašą įvestis.txt failą, nukopijavau failo aprašą į standartinį įvesties failo aprašą STDIN_FILENO (0) naudojant dup2 () funkcija. Failo aprašas įvestis.txt dabar yra numatytasis nustatymas stdin bylos aprašas.

dup2 (input_fds, STDIN_FILENO)

Aš taip pat galėčiau parašyti dup2 () veikia taip. Rezultatas būtų tas pats. STDIN_FILENO turi vertę 0, kuri yra vertė stdin bylos aprašas.

dup2 (input_fds, 0)

Aš taip pat patikrinau dup2 () klaidų su šiomis eilutėmis. Jei įvyksta klaida, programa nustatyta spausdinti klaidos pranešimą ir išeiti.

jei (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Nepavyko nukopijuoti failo aprašo.");
išėjimas (EXIT_FAILURE);

Tada aš naudojau scanf () nuskaityti 2 numerius iš įvestis.txt failą.

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

Tada aš pridėjau skaičius ir išspausdinau sumą ant konsolės / terminalo, pagal nutylėjimą stdout.

suma = skaičius1 + skaičius2;
printf ("% d +% d =% d \ n", skaičius1, skaičius2, suma);

Kaip matote, paleidus programą gavau laukiamą rezultatą.

2 pavyzdys:

Sukurkite naują C šaltinio failą 02_dup2.c ir įveskite toliau nurodytas failo kodų eilutes.

# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti
int main (negaliojantis)
int skaičius1, skaičius2, suma;
int input_fds = atidaryti ("./ įvestis.txt ", O_RDONLY);
int output_fds = atidaryti ("./ produkcija.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (output_fds, STDOUT_FILENO);
scanf ("% d% d", & number1, & number2);
suma = skaičius1 + skaičius2;
printf ("% d +% d =% d \ n", skaičius1, skaičius2, suma);
grąžinti EXIT_SUCCESS;

Dabar sukurkite naują failą įvestis.txt tame pačiame kataloge ir įveskite sekančią jo eilutę.

15 41

Šioje programoje aš padariau tą patį, ką ir 1 pavyzdys. Skirtumas tik tas, kad sukūriau naują failą produkcija.txt ir naudojo išvesties failo aprašą.txt kaip numatytasis stdout failo aprašas naudojant dup2 () funkcija. Dabar visa printf () funkcija bus įrašyta į produkcija.txt failą.

Sukūriau naują failą ir išsaugojau failo aprašą output_fds kintamasis.

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

Taip pat nukopijavau failo aprašą output_fds į standartinio failo aprašą. Aš naudojau iš anksto nustatytą konstantą STDOUT_FILENO.

dup2 (output_fds, STDOUT_FILENO);

STDOUT_FILENO yra vertė 1 (numatytoji failo deskriptoriaus vertė stdout). Taigi, galėčiau perrašyti dup2 () funkcijos iškvietimą taip. Tai duotų tuos pačius rezultatus.

dup2 (output_fds, 1);

Likusi programos dalis yra ta pati. Kaip matote, kai paleidžiu programą, ji nieko neatspausdina konsolėje / terminale.

Tačiau programa sukūrė naują failą produkcija.txt failą.

Kaip matote, išvestis įrašoma į failą produkcija.txt.

Jei norite parašyti visas klaidas (stderr) į kitą failą, tada taip pat galite nukopijuoti failo aprašą stderr failo aprašas taip.

dup2 (error_fds, STDERR_FILENO);

Taigi, taip jūs naudojate dup2 () sistemos iškvietimas C. Dėkojame, kad perskaitėte šį straipsnį.

10 geriausių žaidimų, kuriuos reikia žaisti naudojant „Ubuntu“
„Windows“ platforma buvo viena iš dominuojančių žaidimų platformų dėl didžiulio procento žaidimų, kurie šiandien kuriami natūraliai palaikant „Windows...
5 geriausi „Arcade“ žaidimai, skirti „Linux“
Šiais laikais kompiuteriai yra rimta mašina, naudojama žaidimams. Jei negalėsite gauti naujo aukšto rezultato, žinosite, ką noriu pasakyti. Šiame įraš...
Mūšis už Wesnothą 1.13.6 Išleista plėtra
Mūšis už Wesnothą 1.13.6 išleistas praėjusį mėnesį, yra šeštasis 1 versijos kūrimo leidimas.13.„x“ serija ir ji teikia daug patobulinimų, ypač vartoto...