Kurs C
menu C#
Strumienie danych |
Każdy program w C ma do dyspozycji 3 standardowe strumienie danych, jeden strumień wejścia i dwa strumienie wyjścia. Gdy odpalony zostaje program w systemie operacyjnym tworzy się proces, który steruje tym programem. Każdy proces przydziela zawsze trzy standardowe strumienie, aby wiedzieć skąd mają być pobierane dane, albo gdzie ewentualnie wysłać dane. Oczywiście jest możliwość dodania swoich strumieni, które mogą być pobierane z plików, bazy danych itp, albo przekierowania standardowych strumieni do plików lub baz danych. System operacyjny przydziela strumieniom numery, które nazywają się deskryptorami. Wszystkie te numerki umieszczone są w tablicy i odpowiadają za przekierowanie strumienia. Trzy pierwsze numery są zawsze takie same: Strumień wejścia numer 0 - standardowo przypisana klawiatura Strumień wyjścia numer 1 - standardowo przypisany ekran Strumień błędów numer 2 - standardowo przypisany ekran Wszystkie numery powyżej 2 można stworzyć samemu w programie. Aby przekierować standardowe strumienie danych do programu 1.exe z poziomu wiersza poleceń należy wpisać następującą regułę: Powyższa reguła podmieni standardowy strumień wejściowy za pomocą operatora < na plik o nazwie dane.txt. Czyli jeśli w programie użyjemy funkcji scanf(), to ona nie będzie czekała na wpisanie jakiś danych z klawiatury, ale otworzy sobie plik dane.txt i pobierze dane. Następnie przekieruje standardowy strumień wyjściowy za pomocą operatora > do pliku wyj.txt. Jeśli takiego pliku nie ma to sobie go utworzy. A na końcu przekieruje strumień błędów za pomocą operatora 2> do pliku err.txt. Aby przetestować przekierowania należy stworzyć plik 1.exe. Ja zrobiłem coś takiego: Po dopaleniu tego kodu program nie będzie czekał na podanie wartości z klawiatury, ale otworzy plik dane.txt. Następnie standardowy strumień błędów (stderr) zapisze dane w pliku err.txt, a standardowy strumień wyjściowy (stdout) zapisze dane do pliku wyj.txt. Wszystko fajnie, ale jak odebrać numer deskryptora pliku i przekierować go bezpośrednio w kodzie? Do tego celu służy nam funkcja fileno() i dup2(). Działa to bardzo prosto. Jeśli w kodzie zainicjujemy plik, to zostanie on automatycznie dodany do tablicy deskryptorów. Czyli najprawdopodobniej dostanie on numer 3, ponieważ 0, 1 i 2 są zarezerwowane. Aby dowiedzieć się jaki numer został przydzielony należy użyć funkcji fileno(plik). Następnie należy przekierować ten strumień za pomocą funkcji dup2() i tyle. Najlepiej wyjaśnię to na przykładzie. Stwórzmy kod który będzie wykonywał dokładnie to samo co poprzedni i wyświetlał na ekranie numery deskryptorów dla poszczególnych plików. Po odpalaniu na ekranie ukaże się komunikat: Oraz w katalogu z kodem pokażą się nam dwa pliki err.txt oraz wyj.txt. Teraz już możecie sterować strumieniami z poziomu kodu, a nie tylko z poziomu konsoli. |