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ćTeraz utwórz nowy plik wejście.tekst w tym samym katalogu i wpisz w następującym wierszu.
15 41Głó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 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)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;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ćTeraz utwórz nowy plik wejście.tekst w tym samym katalogu i wpisz w następującym wierszu.
15 41W 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.