Programy w systemie UNIX
Standardowe strumienie – standardowe kanały komunikacji między komputerem a otoczeniem (zwykle terminalem). Występują w Uniksie i systemach uniksopodobnych, w środowisku uruchomieniowym C, C++ i ich pochodnych. Trzy podstawowe połączenia I/O noszą nazwy: standard input (stdin, standardowy strumień wejścia), standard output(stdout, standardowy strumień wyjścia) i standard error (stderr, standardowy strumień błędów).
NAZWA
getenv - get zmiennej środowiskowej
SKŁADNIA
# Include < stdlib.h >
char * getenv (const char * name);
OPIS
Funkcja getenv () przeszukuje listę środowiska na łańcuch pasuje do łańcucha wskazywanego przez name. Ciągi są w postaci nazwa = wartość.
Wartość Zwracana
Getenv () zwraca wskaźnik do wartości w środowisku lub NULL jeśli nie ma meczu.
Operacje wejścia/wyjścia
_____________________________________________________________________________________________________
Wielozadaniowość- UNIX jest systemem wielozadaniowym, gdyż może "jednocześnie" obsługiwać wiele procesów.
ps- informacja o aktualnie uruchomionych procesach z bieżącego terminala.
Parametry:
- ps -u nazwaużytkownika - procesy uruchomione przez konkretnego użytkownika.
- ps -t numerterminalu - procesy uruchomione na danym terminalu.
- .
sleep 20- przerwanie na 20 s komunikacji z shellem.
Sygnały przerywające działanie procesu:
SYGNAŁ
|
NAZWA
|
REAKCJA
|
KLAWISZE
|
2
|
int
|
przerwanie działania procesu
|
[Del] lub [Ctrl+C]
|
3
|
quit
|
przerwanie procesu wraz z zapamiętaniem jego statusu
|
[Ctrl+\]
|
9
|
kill
|
bezwzględne przerwanie procesu
|
|
15
|
terminate
|
zakończenie działania procesu
|
|
Potok (ang. pipe) – jeden z mechanizmów komunikacji międzyprocesowej umożliwiający wymianę danych pomiędzy dwoma procesami. Odbywa się to najczęściej poprzez połączeniestandardowego wyjścia jednego procesu ze standardowym wejściem drugiego.
Potoki procesowe
W uniksowych powłokach systemowych używa się symbolu „|” (pionowej linii), aby połączyć dwa lub więcej procesów w potok.
Przykład wykorzystania potoków w systemie UNIX:
Powyższa konstrukcja zwróci listę uruchomionych procesów (ps -a), posortowaną alfabetycznie (sort), niezawierającą powtórzeń (uniq), oraz bez linii zawierających wzorzec sh (grep -v sh).
Do stworzenia nienazwanego potoku służy wywołanie systemowe pipe(). Prototyp funkcji bibliotecznej znajduje się w pliku nagłówkowym unistd.h i ma następującą postać:
Funkcja pipe() umieszcza dwa nowe deskryptory plików w tablicy fields[] (fields[0] – deskryptor pliku tylko do odczytu, fields[1] – deskryptor pliku tylko do zapisu) i zwraca 0 w przypadku powodzenia lub -1 w przypadku błędu.
Funkcja pipe() często używana jest w połączeniu z funkcją fork() w celu zapewnienia komunikacji między procesem macierzystym oraz jego procesami potomnymi.
Potoki w wierszach poleceń
Wszystkie powszechnie używane powłoki Unix i Windows posiadają specjalną strukturę składniową dla tworzenia potoków. W standardowym użyciu polecenia filtra pisane są w sekwencji, oddzielone znakiem „|” (który, z tego powodu jest często nazywane „znakiem pipe”). Powłoka rozpoczyna proces i tworzy niezbędne połączenia pomiędzy standardowymi strumieniami (uwzględniając pewien bufor).
Strumień błędu
Z założenia standardowe strumienie błędów procesów w potoku nie są przez niego przekazywane, lecz łączone i kierowane na konsolę. Jednakże wiele powłok posiada dodatkową składnię zmieniającą to zachowanie. W powłoce csh, na przykład, używanie „|&” zamiast „|” oznacza, że standardowy strumień błędu powinien także zostać połączony ze standardowym wyjściem i przekazany do następnego procesu. Powłoka Bourne'a także potrafi połączyć standardowy błąd (za pomocą 2>&1), jak również przekierować go do innego pliku.
Pipemill (walcownia)
W najpowszechniej używanych prostych potokach powłoka łączy serię podprocesów poprzez potok i wykonuje zewnętrzne komendy w obrębie każdego podprocesu. W efekcie powłoka sama w sobie nie wykonuje żadnego bezpośredniego przetwarzania danych wpływających poprzez potok. Jednakże powłoka może wykonać przetwarzanie bezpośrednio. Konstrukt ten, ogólnie rzecz biorąc, wygląda mniej więcej następująco:
...co jest nazywane z angielskiego „pipemill” (walcownia).
Implementacja
W większości systemów uniksowych, wszystkie procesy potoku są rozpoczynane jednocześnie, z ich strumieniami odpowiednio połączonymi i zarządzanymi przez algorytm szeregowania wraz z innymi procesami uruchomionymi na maszynie. Istotnym aspektem, odróżniającym potoki uniksowe od innych, jest koncept buforowania: program wysyłający może wyprodukować do 5000bajtów na sekundę, a program odbierający może ich przyjąć jedynie 100 na sekundę, jednak żadne dane nie giną. Zamiast tego, strumień wyjściowy programu wysyłającego jest trzymany w kolejce. Kiedy program odbierający jest gotów odczytać dane, system operacyjny przesyła mu dane z kolejki, następnie usuwa te dane z kolejki. Jeżeli bufor kolejki się zapełni, program wysyłający zostaje zawieszony (zablokowany) aż do momentu kiedy program odbierający ma możliwość odczytać jakąś część danych i zrobić miejsce w buforze. W systemie Linux rozmiar buforu to 65536 bajtów.
Potoki sieciowe
Narzędzia takie jak netcat i socat mogą połączyć potoki z gniazdami TCP/IP, zgodnie z jedną z zasad filozofii UNIX głoszącą, że „wszystko jest plikiem”.
Potok nazwany
Potok nazwany (lub łącze nazwane) jest to rozwinięcie idei potoku, polegające na stworzeniu specjalnego pliku, który ma służyć jako łącznik między procesami. Zapewnia to wygodny mechanizm przekazywania danych pomiędzy niespokrewnionymi ze sobą procesami. Wtedy ten specjalny plik potoku jest "nazwą" potoku w tym sensie, że operacje pisania i czytania wykonane na pliku są w istocie czytaniem z i pisaniem do potoku, a plik potoku służy jako swoisty punkt dostępowy.
W Uniksie do tworzenia potoków nazwanych stosuje się program mkfifo lub mknod.
Z poziomu programu można skorzystać z następujących dwóch standardowych funkcji: