ª¡cza nienazwane.

Transkrypt

ª¡cza nienazwane.
Laboratorium
z systemów operacyjnych
Š¡cza komunikacyjne I - ª¡cza nienazwane.
Anna Wojak
1
Zagadnienia do samodzielnego przygotowania:
• ª¡cze komunikacyjne i ich charakteryzacja, potok nienazwany,
• cechy ª¡cz komunikacyjnych nienazwanych, dziedziczenie deskryptorów otwartch plików od
procesu macierzystego,
• i-w¦zeª, jedno- oraz dwukierunkowa komunikacja mi¦dzy procesami.
1
Š¡cza nienazwane - funkcje systemowe.
Š¡cza komunikacyjne sªu»¡ do komunikacji mi¦dzy procesami. Je±li procesy chc¡ si¦ komunikowa¢
za pomoc¡ takiego ª¡cza, musz¡ zna¢ jego deskryptory. Jedynym ze sposobów przekazania informacji
o ª¡czu nienazwanym jest przekazanie jego deskryptorów procesom potomnym dzi¦ki dziedziczeniu
tablicy otwartych plików od swojego procesu macierzystego. Do utworzenie ª¡cza i komunikacji za
jego po±rednictwem sªu»¡ nastepuj¡ce funkcje:
pipe()
int pipe(int ledes[2])
• funkcja pipe tworzy par¦ sprz¦»onych deskryptorów pliku, wskazuj¡cych na i-w¦zeª potoku i
umieszcza je w tablicy wskazanej przez ledes ,
• ledes[0] - deskryptor potoku dla odczytu, leses[1] - dla zapisu,
• poprawne zako«czenie dziaªania funkcji powoduje zwrócenie 0, natomiast w przypadku bª¦du
zwracana jest warto±c -1,
• mo»liwe kody bª¦dów:
EMFILE - w procesie u»ywanych jest zbyt wiele deskryptorów pliku,
ENFILE - tablica plików systemu jest peªna,
EFAULT - deskryptor f iledes jest nieprawidªowy,
• komunikacja przez ª¡cze wymaga aby dwa procesy znaªy deskryptory tego samego ª¡cza,
• proces który utworzyª potok mo»e si¦ przez niego komunikowa¢ tylko ze swoimi potomkami
lub przekaza¢ im odpowiednie deskryptory, umo»liwiaj¡c w ten sposób wzajemn¡ komunikacj¦.
read()
int read(int ledes, void *buf, size_t count)
• liczba zwracana przez read - ilo±¢ rzeczywicie przeczytanych bajtów,
• -1 w przypadku wyst¡pienia bª¦du,
• buf - adres bufora znajduj¡cego si¦ w segmencie danych procesu, do którego zostan¡ przekazane
dane odczytane z pliku w wyniku wywoªania funkcji read,
• count - ilo±¢ bajtów do odczytania,
• mo»liwe kody bª¦dów:
EISDIR - f iledes odnosi si¦ do katalogu,
2
Rysunek 1: Schemat komunikacji poprzez ª¡cze nienazwane
EBADF - f iledes nie jest prawidªowym deskryptorem pliku, lub nie jest otwarty dla
odczytu,
EINVAL - f iledes wskazuje na obiekt nieodpowiedni do odczytu,
EFAULT - buf wskazuje poza dost¦pn¦ przestrze« adresow¡,
EINTR - wywoªanie zostaªo przerwane sygnaªem przed odczytaniem danych,
EAGAIN - przy u»yciu O_NONBLOCK wybrano nieblokujace I/O, a nie ma akurat
danych dost¦pnych do odczytania natychmiast,
EIO - bª¡d I/O.
• je±li wszystkie deskryptory do zapisu s¡ zamkni¦te i ª¡cze jest puste, to zostaje zwrócona
warto±¢ 0,
• dane odczytane z ª¡cza s¡ z niego zarazem usuwane, w przeciwie«stwie do pliku (mo»na je
odczytywa¢ wielokrotnie) wobec czego mog¡ by¢ one odczytane tylko przez jeden proces i
tylko jeden raz.
write()
int write(int ledes, void *buf, size_t count)
• liczba zwracana przez write - ilosc rzeczywicie zapisanych bajtów,
• -1 w przypadku wyst¡pienia bª¦du,
• buf - adres bufora znajduj¡cego si¦ w segmencie danych procesu, z którego zostan¡ pobrane
dane zapisane przez funkcje write,
3
• count - ilo±¢ bajtów do zapisania
• mo»liwe kody bª¦dów:
EFAULT -adres buf jest poza dostepn¡ przestrzeni¡ adresow¡,
EINVAL - f iledes wskazuje na obiekt nieodpowiedni do zapisu,
EBADF - f iledes nie jest prawidªowym deskryptorem pliku, lub nie jest otwarty dla
odczytu,
EAGAIN - wybrano nieblokujacy I/O (przy u»yciu O_NONBLOCK) a do potoku lub
gniazda o deskryptorze filedes nie mo»na natychmiast zapisac danych,
EINTR - wywoªanie zostaªo przerwane sygnaªem przed zapisaniem danych,
ENOSPC - urz¡dzenie, zawierajace plik o deskryptorze f iledes nie ma miejsca na dane,
EPIPE - ledes jest podª¡czony do potoku, lub gniazda, którego drugi koniec jest
zamkniety.
• funkcja zapisuje w potoku count bajtów w caªo±ci, nie przeplataj¡ si¦ one z danymi pochodz¡cymi
z innych zapisów,
• je»eli nie jest mo»liwe zapisanie bloku danych ze wzgl¦du na brak miejsca w ª¡czu, proces
blokowany jest w funkcji write tak dªugo a» pojawi si¦ odpowiednia ilo±¢ wolnego miejsca.
Podsumowuj¡c je»eli ª¡cze jest peªne to proces zapisuj¡cy zostaje na czas zwolnienia ª¡cza
u±piony i analogicznie, je»eli ª¡cze jest puste to proces czytaj¡cy zostaje u±piony. Informacja
zapisana do potoku jest odczytywana w kolejno±ci zapisu, po odczytaniu informacje s¡ kasowane
i nie jest mo»liwe ponowne ich odczytanie.
2 literatura
• Havilland K., Gray D., Salama B., Unix - programowanie systemowe,1999
• Stevens R.W., Programowanie w rodowisku systemu UNIX, WNT, 2002.
• Rochkind M.J., Programowanie w systemie UNIX dla zaawansowanych, WNT, 1997.
4

Podobne dokumenty