sem_init kreuje semafor bez nazwy i inicjuje jego licznik. Niezerowa

Transkrypt

sem_init kreuje semafor bez nazwy i inicjuje jego licznik. Niezerowa
sem_init kreuje semafor bez nazwy i inicjuje jego licznik. Niezerowa wartość dla argumentu pshared
oznacza, że semafor może być dzielony między procesami. Zero oznacza, że będzie dzielony między
wątkami procesu.
Błędy:
EINVAL wartość przekracza SEM_VALUE_MAX.
ENOSYS pshared jest niezerowe, ale system nie wspiera udostępniania między procesami
(sem_overview(7))
ipcrm - usuwa kolejkę komunikatów, zbiór semaforów lub id pamięci dzielonej.
SKŁADNIA
ipcrm [ -M klucz | -m id | -Q klucz | -q id | -S klucz | -s id ] ...
OPIS
ipcrm usuwa z systemu obiekty komunikacji międzyprocesowej Systemu V (IPC) oraz skojarzone z nimi
struktury danych. Aby usunąć takie obiekty, należy być superużytkownikiem lub twórcą albo
właścicielem obiektu. Są trzy typy obiektów IPC Systemu V: pamięć dzielona, kolejki komunikatów i
semafory. Usuwanie obiektu typu kolejka komunikatów lub semafor jest natychmiastowe (niezależnie
od tego, czy jakiś proces wciąż trzyma identyfikator IPC tego obiektu). Obiekt typu pamięć
współdzielona jest usuwany tylko wtedy, gdy wszystkie obecnie połączone procesy odłączą
(shmdt(2)) ten obiekt z ich wirtualnej przestrzeni adresowej.
Dwiema funkcjami służącymi do badania stanu deskryptorów są select() oraz poll(). Funkcja poll() jest
tylko odmianą select().
#include <sys/poll.h>
int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
ufds - Wskaźnik do tablicy struktur określających sposób monitorowania poszczególnych
deskryptorów:
struct pollfd {
int fd;
/* deskryptor
*/
short events; /* zdarzenia do monitorowania */
short revents; /* zdarzenia, które zaszly */
};
Pola events oraz revents mogą przyjmować m.in. takie wartośći:
POLLIN - Są nowe dane do odczytu (odpowiednik readfds w select()).
POLLPRI - Są nowe specjalne dane do odczytu (odpowiednik exceptfds).
POLLOUT - Można wysyłać dane do deskryptora (odpowiednik writefds).
POLLERR - Błąd.
POLLNVAL - Nie ma takiego deskryptora.
Reszta wartośći znajduje się w bits/poll.h
Pole events zawiera warunki, które chcemy sprawdzać na danym deskryptorze fd. Natomiast pole
revents jest wypełniane przez funkcję podczas powrotu. Zawiera ono warunki, które odblokowały
funkcję.
nfds - Ilość struktur zawartych w tablicy ufds.
timeout - Limit czasowy w milisekundach. Wartość ujemna oznacza brak limitu.
Funkcja zwraca ilość deskryptorów, które zmieniły swój stan albo 0 jeśli upłynął limit czasowy. Błąd to
-1.
Funkcja ioctl() w założeniu przeznaczona do kontrolowania zachowania różnych urządzeń, w praktyce
może być wykorzystana do zmieniania atrybutów gniazd, pobierania listy interfejsów, zmieniania tabeli
routingu, tablic ARP ...
#include <sys/ioctl.h>
int ioctl (int d, int request, ...)
d - Deskryptor "urządzenia". W naszym przypadku po prostu deskryptor gniazda.
request - Polecenie przekazywane do "urządzenia".
... - Różne parametry w zależności od request.
Wszystkich ioctl'sow jest bardzo dużo. Praktycznie każde urządzenie udostępnia jakis ioctl. Całkiem
obfitą listę można zobaczyć wydając polecenie man ioctl_list. Natomiast wszystkie ioctls
ukierunkowane na sterowanie szeroko pojętą siecią (gniazda, interfejsy, routing itp.) można zobaczyć
w pliku /usr/include/bits/ioctls.h. Teraz tylko króciutko przyjrzymy się kilku najczęściej używanym - jak
z nich skorzystać zobaczymy trochę później. Oto one:
SIOCADDRT, SIOCDELRT - dodawanie/usuwanie wpisów w tablicy routingu
SIOCGIFNAME - zwraca nazwę interfejsu na podstawie jego indeksu
SIOCGIFINDEX - odwrotnie niż SIOCGIFNAME
SIOCSIFNAME - zmienia nazwę interfejsu
SIOCGIFCONF - pobiera listę interfejsów sieciowych obecnych w systemie
SIOCGIFFLAGS, SIOCSIFFLAGS - odczyt/zmiana różnych flag interfejsów
SIOCGIFADDR , SIOCSIFADDR - odczyt/zmiana adresów interfejsów
SIOCGIFNETMASK, SIOCSIFNETMASK - odczyt/zmiana masek sieciowych interfejsów
SIOCGIFHWADDR , SIOCSIFHWADDR - odczyt/zmiana adresów MAC
FIOCSETOWN, FIOCGETOWN - dokladnie to samo, co wywołanie fcntl() z argumentami
F_SETOWN/F_GETOWN ...
SIOCSPGRP , SIOCGPGRG - SIOCSPGRP=FIOCSETOWN, SIOCGPGRP=FIOCGETOWN
FIOASYNC - to samo co fcntl(sd,F_SETFL,O_ASYNC)
SIOCGSTAMP - podaje, czas nadejścia ostatniego pakietu na danym gnieździe
FIONREAD - podaje ilość danych do odczytania znajdujących się w buforze gniazda (TCP)
TIOCOUTQ - podaje ilość danych znajdujących się w kolejce do wysłania (TCP)
SIOCATMARK - sprawdza, czy aktualny wskaźnik odczytu wskazuje na miejsce, w którym zostały
odebrane dane OOB (TCP)
fg: http://newbie.linux.pl/?id=article&show=464
tcsetpgrp:
https://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/tsetpgp.htm
tcgetattr:
https://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/tgetatr.htm
Inwersja priorytetów:
http://pl.wikipedia.org/wiki/Inwersja_priorytet%C3%B3w
Terminale1
Każdy system komputerowy jest wyposażony w pewną liczbę urządzeń przeznaczonych do komunikacji
z użytkownikiem lub innymi komputerami. Mianem „terminal” określa się najczęściej monitor i
klawiaturę, choć można tym terminem określić również takie urządzenia jak modem i drukarka. W
przypadku systemów uniksowych określa się tak również protokół terminala określający sposób
obsługi danego urządzenia przez system operacyjny i część systemu obsługującą urządzenia interakcji
z użytkownikiem. Istnieje zbiór funkcji wchodzących w skład API, które umożliwiają programom
użytkownika sterowanie zachowaniem terminali. Z każdym terminalem są związane dwie kolejki,
wejściowa i wyjściowa, które stanowią rodzaj buforów jądra na znaki, które mają zostać zapisane na
ekran, bądź które zostały pobrane z klawiatury. Każdy terminal może pracować w dwóch trybach:
kanonicznym i niekanonicznym. W pierwszym trybie znaki przeczytane lub zapisywane na terminal są
przetwarzane grupami, które kończą znaki nowej linii, końca linii, lub końca pliku. Ponadto niektóre
znaki mają specjalne znaczenia, np.: mogą powodować skasowanie poprzedzającego je znaku.
1
Źródło http://achilles.tu.kielce.pl/Members/achrobot/archiwum/ii-semestr-20132014/pdf/so2/lab/so2_instrukcja_8.pdf
Natomiast w trybie niekanonicznym program może określić samodzielnie jakimi porcjami mają być
czytane i pisane dane na terminal, oraz które znaki będą znakami kontrolnymi.
Wybrane funkcje i struktury danych 2
Podstawową strukturą danych wykorzystywaną w obsłudze terminali jest struktura termios. Standardy
uniksowe gwarantują, eż będą się w niej znajdować przynajmniej następujące pola:
 c_iflag – pole określające flagi trybu wejścia,
 c_oflag – pole określające flagi trybu wyjścia,
 c_cflag – pole określające flagi trybu sterowania,
 c_lflag – pole określające flagi trybu lokalnego,
 cc_t c_cc[NCCS] – tablica określająca, które znaki są związane z funkcjami kontrolnymi.
Uwaga: Niektóre terminale mogą definiować własne pola w tej strukturze, związane np. z obsługą
kolorowych wyświetlaczy, dlatego przy manipulacji ustawieniami terminala należy przeczytać jego
bieżące ustawienia, zapamiętać je w osobnej zmiennej, a następnie zmodyfikować odpowiednie pole
struktury termios, przy pomocy odpowiednich stałych i operatorów bitowych. Potem należy wywołać
funkcję zmieniającą zachowania terminala.
Przed zakończeniem program powinien przywrócić domyślną obsługę terminala.
 funkcja isatty() – sprawdza, czy podany deskryptor pliku odnosi się do pliku urządzenia
terminala (Szczegóły: man isatty).
 funkcja ttyname() – zwraca nazwę pliku terminala do której odnosi się deskryptor (Szczegóły:
man ttyname).
 funkcja tcgetattr() – pobiera bieżące atrybuty terminala zwi zanego ą z podanym deskryptorem
pliku i zapisuje je do struktury termios (Szczegóły: man tcgetattr).
 funkcja tcsetattr() – ustawia żądane atrybuty terminala związanego z podanym deskryptorem
pliku. Należy zauważyć, że stan tych atrybutów nie zmieni się po zakończeniu programu i jeśli
nie przywrócimy domyślnej procedury obsługi terminala możemy zakłócić pracę innych
programów współpracujących z tym samym terminalem (Szczegóły man tcsetattr).
 makro VMIN – ma znaczenie tylko w trybie niekanonicznym, wyznacza położenie miejsca w
tablicy cc określającego liczbę bajtów, która musi się znaleźć w kolejce wejściowej zanim
zostanie zakończona operacja odczytu.
 makro VTIME – ma znaczenie tylko w trybie niekanonicznym, określa miejsce w tablicy cc,
określające jak długo będzie czekał system zanim zakończy operacje wejścia. Jednostką czasu
jest 0,1 sekundy.
Szczegółowy opis wszystkich funkcji i struktur danych związanych z obsługą terminali znajduje się w
podręczniku systemowym (man termios) i w dokumentacji biblioteki glibc: „The GNU C Library
Reference Manual” autorstwa Sandry Loosemore, Richarda Stallmana, Rolanda McGratha, Andrew
Orama i Urlicha Dreppera.
2
Źródło j.w.