[ Pobierz całość w formacie PDF ]
.7).lRys.7 Wartość semafora pamiętana w jądrze systemulPrzyjrzyjmy się pokrótce wewnętrznym strukturom stosowanymi do opisu operacji na semaforach i zarządzanych przez jądro.llStruktura (jądra) semid_ds.Podobnie jak w przypadku kolejki wiadomości, jądro zarządza specjalna wewnętrzną strukturą oddzielna dla każdego zbioru semaforów (patrz plik linux/msg.h):l/* jedna struktura semid na każdy zbiór semaforóww systemie*/struct semid_ds{struct ipc_perm sem_perm; /* uprawnienia */time_t sem_otime; /* czas ostatniej operacji na sem */time_t sem_ctime; /* czas ostatniej zmiany */struct sem *sem_base; /* wskażnik na pierwszy semaforw tablicy */struct wait_queue *eventn;struct wait_queue *eventz;struct sem_undo *undo; /* żądanie anulowania do tejtej tablicy */ushort sem_nsems; /* liczba semaforów w tablicy */};lprzy czym znaczenie niektórych pól jest nastepujące:llsem_perm - egzemplarz struktury ipc_perm, zdefiniowanej w linux/ipc.h; przechowuje informację o uprawnieniach do zbioru semaforów, włączając prawa dostępu oraz twórcy zbioru semaforów (uid, etc.),llsem_otime - czas ostatniej operacji semop() (patrz dalej),llsem_ctime - czas ostatniej zmiany w tej strukturze,llsem_base - wskażnik do pierwszego semafora w tablicy (patrz następna struktura),llsem_undo - liczba żądań undo w tej tablicy (patrz dalej),llsem_nsems - liczba semaforów w zbiorze semaforów (w tablicy).llStruktura (jądra) sem.W strukturze semid_ds.znajduje się odwołanie (wskaźnik) do tablicy semaforów.Każdy semafor opisany jest z kolei przy pomocy struktury sem (patrz plik linux/msg.h):l/* jedna struktura na każdy semafor w systemie*/struct sem{short sempid; /* pid ostatniej operacji */ushort semval; /* bieżąca wartość */ushort semncnt; /* liczba procesów oczekujących nazwiekszenie semvalushort semzcnt; /* liczba procesów oczekującychwartości semval = 0 */};lgdzie:llsem_pid - PID procesu, który ostatnio dokonał operacji na semaforze,llsem_semval - aktualna wartość semafora,llsem_semncnt - liczba procesów oczekujących na zwolnienie zasobu,llsem_semzcnt - liczba procesów oczekujących na 100% wykorzystanie zasobu.llWywołanie systemowe semget().Funkcji semget() tworzy nowy zbiór semaforów lub udostęnia zbiór już istniejący.lWywołanie systemowe: semget();Prototyp: int semget ( key_t key, int nsems, int semflg );RETURNS: semaphore set IPC identifier on success-1 on error: errno =EACCESS (permission denied)EEXIST (set exists, cannot create (IPC_EXCL))EIDRM (set is marked for deletion)ENOENT (set does not exist, no IPC_CREAT wasENOMEM (Not enough memory to create new set)ENOSPC (Maximum set limit exceeded)lPierwszy argument msgget() jest wartościa klucza (zwracaną przez ftok()).Wartość tego klucza jest następnie porównywana z istniejącymi wartościami klucza, które znajdują się w wewnątrz jądra dla innych zbiorów semaforów.Wynik operacji otwarcia lub dostępu do kolejki zależy od zawartości argumentu semflag, którego 9 najmniej znaczących bitów określa tryb dostępu do kanału komunikacji między procesowej (w tym przypadku do zbioru semaforów):llIPC_CREAT - tworzy zbiór semaforów, jeśli nie istnieje w jądrze; jeśli zbiór istnieje, to zwróci jej identyfikatorllIPC_EXCL - jeśli użyta razem z IPC_CREAT zwraca błąd w przypadku, gdy kolejka już istnieje (użycie samego IPC_EXCL nie wywołuje żadnych działań); jeśli kolejka nie istnieje - zostanie utworzona [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • milosnikstop.keep.pl