Do spisu tresci tematu 9

Sygnaly zwiazane z gniazdami

Spis tresci

Sygnal SIGIO


Ten sygnal wskazuje, ze gniazdo jest gotowe do wykonania operacji wejscia-wyjscia. Sygnal jest wysylany do grupy procesow dla tego gniazda. Grupe procesow ustanawia sie w wyniku wywolania funkcji systemowej ioctl z okreslona opcja FIOSETOWN lub SIOCSPGRP, albo funkcji systemowej fcntl z opcja F_SETOWN. Sygnal ten jest wysylany do grupy procesow tylko wtedy, gdy proces - wywolujac funkcje ioctl z opcja FIOASYNC lub funkcje fcntl z opcja F_SETFL - udostepnil mozliwosc korzystania z wejscia-wyjscia asynchronicznego w odniesieniu do danego gniazda.

Implementacja


Podczas tworzenia gniazda, wykonywane sa przypisania (sk - wskaznik na strukture sock ):
def_callback* sa to wskazniki na funkcje,zdefiniowane w odpowiednim pliku af_inet lub af_unix. Tak wiec, kiedy np. naplyna do gniazda dane, zostanie wykonana instrukcja sk->data_ready(...) - czyli def_callback2. Ta z kolei wywola sock_wake_async(...), ktora wreszcie wywola kill_fasync(...) .Ta ostatnia funkcja, zdefiniowana w fs/fcntl.c, wysle do wszystkich procesow z listy nasze_gniazdo->fasync_list sygnal SIGIO.


Sygnal SIGURG


Ten sygnal wskazuje, ze gniazda dotyczy jakas sytuacja pilna. Jest to albo nadejscie danych wysokopriorytetowych do gniazda (protokol TCP), albo obecnosc informacji o stanie sterowania, ktora trzeba odebrac od czesci nadrzednej pseudoterminala pracujacego w trybie pakietowym. Sygnal jest wysylany do grupy procesow dla tego gniazda.
Sygnal SIGURG jest generowany przez warstwe TCP ( plik ip4/tcp_input.c, linia 1612 ).


Sygnal SIGPIPE


Ten sygnal wskazuje, ze nie mozemy juz dluzej wysylac danych do gniazda,lacza komunikacyjnego lub kolejki FIFO - bo, na przyklad, zaden proces nie "slucha na drugim koncu" lacza. Proces nie musi niczego specjalnego robic w celu odebrania tego sygnalu, ale jesli proces go nie przechwyci, to czynnoscia domyslna jest zakonczenie procesu. Sygnal jest wysylany tylko do procesu zwiazanego z danym gniazdem, nie dotyczy zas grupy procesow.
SIGPIPE moze byc wyslany z funkcji sendmsg ( tu jest jej opis ), a takze przez warstwe TCP ( funkcja do_tcp_sendmsg, plik i4/tcp.c ).


Bibliografia


  1. Zrodla kernela Linuxa 2.0.0 + Linux Navigator
  2. W. Stevens "Programowanie zastosowan sieciowych"

Autor: Rafal Wojtczuk