ª¡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