12.07.2015 Views

Spis treœci - Patrz

Spis treœci - Patrz

Spis treœci - Patrz

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Jeżeli kanał o numerze key jeszcze w systemie nie istnieje, to funkcja msgget powodujeutworzenie go. Jeżeli kanał utworzono lub gdy proces uzyskał dostęp do istniejącego jużkanału, to wynikiem funkcji jest identyfikator kanału, w przeciwnym razie wynikiem jest -1.Na przykład instrukcjaK1 = rasgget (1, IPC_CREAT | 0666);wykonana po raz pierwszy spowoduje utworzenie kanalu o numerze 1 i przypisanie zmiennejK1 identyfikatora tego kanału. Jeżeli zaś po wykonaniu tej instrukcji wykonałaby się instrukcjaK2 = msgget (1, IPC_CREAT | 0666);to zmienna K2 wskazywałaby ten sam kanał, co zmienna K1.Operacje na kanałachOperacjom włóż i n_wloz odpowiada w systemie Unix funkcjaint msgsnd (int msqid, struct msgbuf *msgp, int msgsz, int msgflg);Parametr msqid jest identyfikatorem kanału, a msgp - wskaźnikiem do struktury o następującejdeklaracji:struct msgbuf {long mtype; /* identyfikator podkanału *//* treść komunikatu */}składającej się z identyfikatora mtype podkanału, do którego ma być włożony komunikat, orazzmiennych zawierających komunikat. Tę część struktury użytkownik deklaruje w zależnościod potrzeb. Dla komunikatu pustego struktura msgbuf składa się tylko z identyfikatorapodkanału. Kolejne parametry funkcji msgsnd to: msgsz - wielkość przesyłanego komunikatu(czyli rozmiar zadeklarowanych zmiennych), msgflg - znacznik określający sposób wykonaniaoperacji. Jeżeli jest ona równa stałej IPC_NOWAIT, to operacja jest nieblokująca, jeżelinatomiast jest równa 0, to operacja jest blokująca.Wynikiem funkcji msgsnd jest 0, gdy operacja wykona się, - 1 w przeciwnym razie.Powody niewykonania mogą być różnorakie - dla nas interesujący jest jeden: operacja jestnieblokująca, a kanał całkowicie zapełniony komunikatami.Operacjom weź i n_wez odpowiada w systemie Unix funkcja:int msgrcv (int msqid, struct msgbuf *msgp, int msgsz,long msgtyp, int msgflg);Parametr msgtyp oznacza identyfikator podkanału, z którego ma być pobranykomunikat. Znaczenie wartości tego parametru zostało podane przy opisie operacji weź.Pozostałe parametry mają takie samo znaczenie jak parametry funkcji msgsnd. W strukturzewskazywanej przez msgp znajdują się wartości funkcji msgrcv: identyfikator podkanału, zktórego pobrano komunikat, oraz sam komunikat.Wynikiem funkcji msgrcv jest 0, gdy operacja wykona się, - 1 w przeciwnym razie.Powody niewykonania mogą być różnorakie - dla nas interesujący jest jeden: operacja jestnieblokująca, a podkanał (lub podkanały), z którego ma być pobrany komunikat, jest pusty.Pojemność kanałuKanał ma pewną standardową pojemność, wyrażaną w bajtach, która jest parametremsystemu operacyjnego. Użytkownik może jedynie zmniejszyć pojemność kanału, natomiastzwiększyć może ją tylko administrator systemu. Suma wielkości treści komunikatów wewszystkich podkanałach nie może być większa od pojemności kanału.Do odczytania lub nadania pojemności kanału służy funkcjaint msgctl (int msqid, int cmd, struct msqid_ds *bufp);230

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!