C Programmēšana

dup2 sistēmas izsaukums C

dup2 sistēmas izsaukums C
The dup2 () sistēmas funkcija tiek izmantota, lai izveidotu esoša faila deskriptora kopiju. Linux operētājsistēmā ir 3 standarta failu deskriptori. Viņi ir:

stdin: Šis ir standarta ievades faila deskriptors. Pēc noklusējuma to izmanto, lai ņemtu ieeju no termināla. scanf (), getc () utt funkcijas izmanto stdin faila deskriptors, lai ņemtu lietotāja ievadi. The stdin faila deskriptoru attēlo arī skaitlis 0.

stdout: Šis ir standarta izvades faila deskriptors. Pēc noklusējuma to izmanto, lai kaut ko izdrukātu konsolē / terminālā. Plaši izmantots printf () funkcija izmanto stdout lai drukātu vēlamo izvadi konsolē / terminālā. The stdout faila deskriptoru attēlo arī skaitlis 1.

stderr: Šis ir standarta kļūdas faila deskriptors. Tas dara to pašu, ko stdout faila deskriptors. The stderr faila deskriptors tiek izmantots, lai drukātu kļūdas ziņojumus konsolē / terminālā. Vienīgā atšķirība ir, ja jūs izmantojat stderr faila deskriptors, lai izdrukātu kļūdas ziņojumus, un stdout faila deskriptors, lai izdrukātu parastās izejas, pēc tam tos var vēlāk atdalīt. Piemēram, kļūdas ziņojumus varat novirzīt uz failu un parastās izejas uz konsoli vai citu failu. The stderr faila deskriptoru attēlo arī skaitlis 2.

Izņemot šos 3 failu aprakstus, C var izveidot papildu failu aprakstus. Lai izveidotu jaunu faila deskriptoru, varat izmantot atvērts () funkcija C. The atvērts () funkcija atver jaunu failu, izveido faila deskriptoru un pievieno citu numuru, nevis 0, 1, 2 faila aprakstam.

Kad esat atvēris failu, izmantojot atvērts () funkciju, varat izmantot lasīt () un rakstīt () funkcija, lai lasītu un rakstītu jaunizveidotajā faila aprakstā.

Tagad iedomājieties situāciju, kurā vēlaties lasīt no konkrēta faila, izmantojot scanf () vai getc () funkciju un rakstiet uz citu failu, izmantojot printf () funkciju. Tā nav noklusējuma scanf (), getc () un printf () funkcijas, kā es paskaidroju iepriekš. Pēc noklusējuma, scanf () un getc () funkcija izmanto stdin un printf () izmanto stdout un nav iespējas pateikt šīm funkcijām izmantot citus failu aprakstus. Tātad, lai mainītu šo noklusējuma uzvedību, jums ir jāaizstāj stdin un stdout failu aprakstus ar vēlamajiem failu aprakstiem. Tas ir tas, ko dup2 () sistēmas funkcija to dara. The dup2 () funkcija kopē faila deskriptoru uz citu faila deskriptoru.

dup2 () Sintakse un atgriešanās vērtība:

Sintakse dup2 () funkcija ir:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () funkcija kopē old_file_descriptor iekšā new_file_descriptor. Ja new_file_descriptor jau pastāv, tad tas tiek automātiski aizvērts un pēc tam old_file_descriptor tiek kopēts tajā.

Pēc panākumiem dup2 () funkcija atgriež jauno faila deskriptoru. Ja rodas kļūda, dup2 () atgriežas -1.

The dup2 () funkcija ir definēta galvenes failā unistd.h.

Jums jāiekļauj galvene unistd.h C avota failā, lai izmantotu dup2 () darbojas šādi:

# iekļaut

Lai iegūtu vairāk informācijas, skatiet vietnes Man lapu dup2 () ar šādu komandu:

$ man dup2

1. piemērs:

Izveidojiet jaunu C avota failu 01_dup2.c un ierakstiet failā šādas kodu rindas.

# iekļaut
# iekļaut
# iekļaut
# iekļaut
 
int main (void)
int skaitlis1, skaitlis2, summa;
 
int input_fds = atvērts ("./ ievade.txt ", O_RDONLY);
 
ja (dup2 (ievades_fdi, STDIN_FILENO) < 0)
printf ("Nevar dublēt faila deskriptoru.");
izeja (EXIT_FAILURE);

 
scanf ("% d% d", & number1, & number2);
 
summa = skaitlis1 + skaitlis2;
 
printf ("% d +% d =% d \ n", skaitlis1, skaitlis2, summa);
 
atgriešanās EXIT_SUCCESS;

Tagad izveidojiet jaunu failu ievade.txt tajā pašā direktorijā un ierakstiet nākamajā rindā tajā.

15 41

Šīs programmas galvenais mērķis ir nolasīt 2 veselus skaitļus no ievade.txt failu, izmantojot scanf () funkciju, pievienojiet tos un izdrukājiet summu.

Pirmkārt, es iekļāvu nepieciešamos galvenes failus ar šādām kodu rindām.

# iekļaut
# iekļaut
# iekļaut
# iekļaut

Iekš galvenais () funkciju, es definēju nepieciešamos mainīgos.

int skaitlis1, skaitlis2, summa;

Tad es atvēru failu ievade.txt tikai lasīšanas režīmā (O_RDONLY) izmantojot atvērts () funkcija un faila deskriptoru saglabāja mainīgajā ievades_fds.

int input_fds = atvērts ("./ ievade.txt ", O_RDONLY);

Kad man būs pieejams faila deskriptors ievade.txt failu, es nokopēju faila deskriptoru standarta ievades faila aprakstā STDIN_FILENO (0) izmantojot dup2 () funkciju. Faila deskriptors ievade.txt tagad ir noklusējums stdin faila deskriptors.

dup2 (ievades_fdi, STDIN_FILENO)

Es varētu arī uzrakstīt dup2 () darbojas šādi. Rezultāts būtu tāds pats. STDIN_FILENO tur vērtību 0, kas ir vērtība stdin faila deskriptors.

dup2 (ievades_fdi, 0)

Es arī pārbaudīju dup2 () kļūdas ar šādām rindām. Ja rodas kļūda, programma ir iestatīta drukāt kļūdas ziņojumu un iziet.

ja (dup2 (ievades_fdi, STDIN_FILENO) < 0)
printf ("Nevar dublēt faila deskriptoru.");
izeja (EXIT_FAILURE);

Tad es to izmantoju scanf () lai skenētu 2 numurus no ievade.txt failu.

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

Tad es pievienoju numurus un uz noklusējuma uz konsoles / termināla izdrukāju summu stdout.

summa = skaitlis1 + skaitlis2;
printf ("% d +% d =% d \ n", skaitlis1, skaitlis2, summa);

Kā redzat, pēc palaišanas programmā es saņēmu gaidīto rezultātu.

2. piemērs:

Izveidojiet jaunu C avota failu 02_dup2.c un ierakstiet failā šādas kodu rindas.

# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
int main (void)
int skaitlis1, skaitlis2, summa;
int input_fds = atvērts ("./ ievade.txt ", O_RDONLY);
int output_fds = atvērts ("./ izeja.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (ievades_fdi, STDIN_FILENO);
dup2 (izejas_fdi, STDOUT_FILENO);
scanf ("% d% d", & number1, & number2);
summa = skaitlis1 + skaitlis2;
printf ("% d +% d =% d \ n", skaitlis1, skaitlis2, summa);
atgriešanās EXIT_SUCCESS;

Tagad izveidojiet jaunu failu ievade.txt tajā pašā direktorijā un ierakstiet nākamajā rindā tajā.

15 41

Šajā programmā es darīju to pašu, ko 1. piemērs. Vienīgā atšķirība ir tā, ka es izveidoju jaunu failu izlaide.txt un izmantoja izvades faila deskriptoru.txt kā noklusējums stdout faila deskriptors, izmantojot dup2 () funkciju. Tagad visi printf () funkcija tiks ierakstīta izlaide.txt failu.

Es izveidoju jaunu failu un saglabāju faila deskriptoru izejas_fds mainīgais.

int output_fds = atvērts ("./ izeja.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

Es arī nokopēju faila output_fds deskriptoru standarta faila aprakstā. Es izmantoju iepriekš definēto konstanti STDOUT_FILENO.

dup2 (izejas_fds, STDOUT_FILENO);

STDOUT_FILENO satur vērtību 1 (faila deskriptora noklusējuma vērtība stdout). Tātad, es varētu pārrakstīt dup2 () funkcijas izsaukumu šādi. Tas dotu tādus pašus rezultātus.

dup2 (izejas_fds, 1);

Pārējā programma ir vienāda. Kā redzat, kad es palaidu programmu, konsolē / terminālā tā neko nedrukā.

Bet programma izveidoja jaunu failu izlaide.txt failu.

Kā redzat, izeja tiek ierakstīta failā izlaide.txt.

Ja vēlaties uzrakstīt visas kļūdas (stderr) uz citu failu, tad varat arī nokopēt faila deskriptoru stderr faila deskriptors šādi.

dup2 (error_fds, STDERR_FILENO);

Tātad, tā jūs izmantojat dup2 () sistēmas izsaukums C. Paldies, ka izlasījāt šo rakstu.

Kā izmantot Xdotool, lai stimulētu peles klikšķus un taustiņsitienus Linux
Xdotool ir bezmaksas un atvērtā koda komandrindas rīks peles klikšķu un taustiņu simulāciju simulēšanai. Šajā rakstā būs īss ceļvedis par xdotool izma...
5 labākie ergonomiskie datoru peles izstrādājumi Linux
Vai ilgstoša datora lietošana izraisa sāpes plaukstas locītavā vai pirkstos? Vai jūs ciešat no stīvām locītavām un jums pastāvīgi ir jāspiež rokas? Va...
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...