DUP2 Call w C w C

DUP2 Call w C w C
dup2 () Funkcja systemowa służy do utworzenia kopii istniejącego deskryptora pliku. W Linux istnieją 3 standardowe deskryptory plików. Oni są:

stdin: To jest standardowy deskryptor pliku wejściowego. Służy domyślnie do przyjmowania danych wejściowych z terminalu. scanf (), getC () itp. Funkcje stdin deskryptor pliku, aby przyjmować dane wejściowe użytkowników. stdin Deskryptor pliku jest również reprezentowany przez numer 0.

Stdout: To jest standardowy deskryptor pliku wyjściowego. Służy domyślnie do wydrukowania czegoś na konsoli/terminalu. Szeroko stosowane printf () Używa funkcji Stdout Aby wydrukować żądaną moc wyjściową na konsoli/terminalu. Stdout Deskryptor pliku jest również reprezentowany przez numer 1.

Stderr: To jest standardowy deskryptor pliku błędu. Robi to samo co Stdout deskryptor pliku. Stderr Deskryptor pliku służy do drukowania komunikatów o błędach na konsoli/terminalu. Jedyną różnicą jest to, jeśli używasz Stderr deskryptor pliku do wydrukowania komunikatów o błędach i Stdout Deskryptor pliku do wydrukowania normalnych wyjść, a następnie możesz je oddzielić. Na przykład możesz przekierować komunikaty o błędach do pliku i normalnych wyjść do konsoli lub innego pliku. Stderr Deskryptor pliku jest również reprezentowany przez numer 2.

Oprócz tych 3 deskryptorów plików, możesz utworzyć dodatkowe deskryptory plików w C. Aby utworzyć nowy deskryptor pliku, możesz użyć otwarty() funkcja w c. otwarty() funkcja otwiera nowy plik, tworzy deskryptor pliku dla tego pliku i dołącza numer inny niż 0, 1, 2 do deskryptora pliku.

Po otwarciu pliku za pomocą otwarty() funkcja, możesz użyć Czytać() I pisać() funkcja do odczytu i zapisu do nowo utworzonego deskryptora pliku.

Teraz wyobraź sobie sytuację, w której chcesz odczytać z określonego pliku za pomocą scanf () Lub getC () Funkcja i zapisz do innego pliku za pomocą printf () funkcjonować. To nie jest domyślne zachowanie scanf (), getC () I printf () funkcje, jak wyjaśniłem wcześniej. Domyślnie, scanf () I getC () Używa funkcji stdin I printf () zastosowania Stdout I nie ma sposobu, aby poinformować te funkcje, aby używać innych deskryptorów plików. Aby zmienić to domyślne zachowanie, musisz wymienić stdin I Stdout Deskryptory plików z żądanymi deskryptorami plików. To jest to, co dup2 () Funkcja systemu robi. dup2 () Funkcja kopiuje deskryptor pliku do innego deskryptora pliku.

DUP2 () Składnia i wartość zwracana:

Składnia dup2 () Funkcja to:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () funkcja kopiuje OLD_FILE_DESCRIPTOR do new_file_descriptor. Jeśli new_file_descriptor już istnieje, a następnie jest automatycznie zamknięty, a potem OLD_FILE_DESCRIPTOR jest skopiowany do tego.

O sukcesie, dup2 () Funkcja zwraca nowy deskryptor pliku. Jeśli wystąpi błąd, dup2 () zwroty -1.

dup2 () Funkcja jest zdefiniowana w pliku nagłówka unistd.H.

Musisz dołączyć nagłówek unistd.H w pliku źródłowym C, aby użyć dup2 () funkcja w następujący sposób:

#włączać

Aby uzyskać więcej informacji, sprawdź stronę mężczyzny dup2 () Z następującym poleceniem:

$ man dup2

Przykład 1:

Utwórz nowy plik źródłowy C 01_dup2.C i wpisz następujące wiersze kodów w pliku.

#włączać
#włączać
#włączać
#włączać
int main (void)
Int Number1, Number2, suma;
int input_fds = otwórz ("./wejście.txt ", o_rdonly);
if (dup2 (input_fds, stdin_fileno) < 0)
printf („Nie można zduplikować deskryptora pliku.");
exit (exit_failure);

Scanf („ %d %d” i numer1 i numer2);
sum = numer1 + numer2;
printf („ %d + %d = %d \ n”, liczba1, liczba2, suma);
return exit_success;

Teraz utwórz nowy plik wejście.tekst w tym samym katalogu i wpisz w następującym wierszu.

15 41

Głównym celem tego programu jest odczytanie 2 liczb całkowitych z wejście.tekst plik za pomocą scanf () Funkcja, dodaj je i wydrukuj sumę.

Po pierwsze, dołączyłem wymagane pliki nagłówka z następującymi wierszami kodów.

#włączać
#włączać
#włączać
#włączać

w główny() funkcja, zdefiniowałem wymagane zmienne.

Int Number1, Number2, suma;

Następnie otworzyłem plik wejście.tekst w trybie tylko w odczytaniu (O_rdonly) używając otwarty() Funkcja i przechowywana deskryptor pliku w zmiennej input_fds.

int input_fds = otwórz ("./wejście.txt ", o_rdonly);

Gdy mam deskryptor pliku wejście.tekst Plik skopiowałem deskryptor pliku do standardowego deskryptora pliku wejściowego Stdin_fileno (0) Używanie dup2 () funkcjonować. Deskryptor pliku wejście.tekst jest teraz domyślnie stdin deskryptor pliku.

dup2 (input_fds, stdin_fileno)

Mógłbym też napisać dup2 () funkcjonować w następujący sposób. Wynik byłby taki sam. Stdin_fileno posiada wartość 0, która jest wartością stdin deskryptor pliku.

dup2 (input_fds, 0)

Sprawdziłem też dup2 () Błędy z następującymi wierszami. Jeśli wystąpi błąd, program jest ustawiony na wydrukowanie komunikatu o błędzie i wyjście.

if (dup2 (input_fds, stdin_fileno) < 0)
printf („Nie można zduplikować deskryptora pliku.");
exit (exit_failure);

Następnie użyłem scanf () zeskanować 2 liczby z wejście.tekst plik.

Scanf („ %d %d” i numer1 i numer2);

Następnie dodałem liczby i wydrukowałem sumę na konsoli/terminalu, domyślnie Stdout.

sum = numer1 + numer2;
printf („ %d + %d = %d \ n”, liczba1, liczba2, suma);

Jak widać, po uruchomieniu programu dostałem oczekiwane dane wyjściowe.

Przykład 2:

Utwórz nowy plik źródłowy C 02_dup2.C i wpisz następujące wiersze kodów w pliku.

#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
int main (void)
Int Number1, Number2, suma;
int input_fds = otwórz ("./wejście.txt ", o_rdonly);
int output_fds = otwórz ("./wyjście.txt ", o_wronly | O_Creat, s_irusr | s_iwusr);
dup2 (input_fds, stdin_fileno);
dup2 (output_fds, stdout_fileno);
Scanf („ %d %d” i numer1 i numer2);
sum = numer1 + numer2;
printf („ %d + %d = %d \ n”, liczba1, liczba2, suma);
return exit_success;

Teraz utwórz nowy plik wejście.tekst w tym samym katalogu i wpisz w następującym wierszu.

15 41

W tym programie zrobiłem to samo, co w Przykład 1. Jedyną różnicą jest to, że utworzyłem nowy plik wyjście.tekst i użył deskryptora pliku wyjściowego.txt jako domyślny Stdout deskryptor pliku za pomocą dup2 () funkcjonować. Teraz wszystkie wyjście printf () Funkcja zostanie zapisana do wyjście.tekst plik.

Utworzyłem nowy plik i zapisałem deskryptor pliku w Output_fds zmienny.

int output_fds = otwórz ("./wyjście.txt ", o_wronly | O_Creat, s_irusr | s_iwusr);

Skopiowałem również deskryptor pliku Output_FDS do deskryptora pliku stdout. Użyłem predefiniowanej stałej Stdout_fileno.

dup2 (output_fds, stdout_fileno);

Stdout_fileno zawiera wartość 1 (domyślna wartość deskryptora pliku Stdout). Mógłbym więc przepisać wywołanie funkcji dup2 () w następujący sposób. Dałoby to te same wyniki.

dup2 (output_fds, 1);

Reszta programu jest taka sama. Jak widać, po uruchomieniu programu nie drukuje niczego na konsoli/terminalu.

Ale program utworzył nowy plik wyjście.tekst plik.

Jak widać, wyjście jest zapisywane w pliku wyjście.tekst.

Jeśli chcesz napisać wszystkie błędy (Stderr) Do innego pliku możesz również skopiować deskryptor pliku do Stderr deskryptor pliku w następujący sposób.

dup2 (error_fds, stderr_fileno);

Tak więc używasz dup2 () wywołanie systemu w c. Dziękujemy za przeczytanie tego artykułu.