Rechercher une page de manuel
semop
Langue: pl
Version: 2003-04-28 (openSuse - 09/10/07)
Section: 2 (Appels système)
NAZWA
semop, semtimedop - operacje na semaforachSK£ADNIA
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
int semtimedop(int semid, struct sembuf *sops, unsigned nsops, struct timespec *timeout);
OPIS
Semafor jest reprezentowany za pomoc± anonimowej struktury zawieraj±cej nastêpuj±ce pola:unsigned short semval; /* warto¶æ semafora */ unsigned short semzcnt; /* # oczekiwanie na zero */ unsigned short semncnt; /* # oczekiwanie na zwiêkszenie */ pid_t sempid; /* proces, który wykona³ ost. op. */Funkcja semop wykonuje operacje na wybranych semaforach z zestawu wskazywanego przez semid. Ka¿dy z nsops elementów tablicy wskazywanej przez parametr sops okre¶la operacjê, która ma byæ wykonana na semaforze. Struktura struct sembuf zawiera nastêpuj±ce pola:
unsigned short sem_num; /* numer semafora */ short sem_op; /* operacja na semaforze */ short sem_flg; /* dodatkowe znaczniki operacji */W sem_flg mog± zostaæ ustawione znaczniki operacji: IPC_NOWAIT i SEM_UNDO. Je¶li operacja jest opatrzona znacznikiem SEM_UNDO, to zostanie cofniêta w chwili, gdy proces zakoñczy dzia³anie.
Zestaw operacji zawartych w sops jest wykonywany atomowo, to znaczy, operacje s± wykonywane jednocze¶nie i tylko wtedy, gdy wszystkie mog± byæ jednocze¶nie wykonywane. Zachowanie funkcji systemowej w sytuacji, gdy nie wszystkie operacje mog± byæ wykonane natychmiast, zale¿y od ustawienia znacznika IPC_NOWAIT w poszczególnych polach sem_flg, jak to opisano poni¿ej.
Ka¿da z nich jest wykonywana na sem_num-tym semaforze w zestawie, przy czym pierwszy semafor ma numer 0. Istniej± trzy rodzaje operacji, rozró¿niane na podstawie warto¶ci sem_op.
Je¶li sem_op jest liczb± dodatni±, to warto¶æ semafora (semval) zostanie zwiêkszona o tê liczbê. Ponadto, je¶li zosta³ przekazany znacznik SEM_UNDO, wówczas system zaktualizuje licznik zmian (semadj) tego semafora dla procesu Operacja ta nigdy nie powoduje wstrzymania procesu. Proces wywo³uj±cy funkcjê musi mieæ prawo do modyfikacji zestawu semaforów.
Je¶li sem_op jest równe 0, proces musi mieæ prawo do odczytu zestawu semaforów. Jest to operacja "oczekiwania na zero" (wait-for-zero): gdy semval ma warto¶æ 0, operacja mo¿e byæ kontynuowana bezzw³ocznie. W przeciwnym razie, je¶li w sem_flg przekazany zosta³ znacznik IPC_NOWAIT, wówczas funkcja systemowa zg³osi b³±d, za¶ zmienna errno przyjmie warto¶æ EAGAIN (i ¿adna z operacji z sops nie zostanie wykonana). Je¶li proces zostanie wstrzymany przez system, wówczas warto¶æ semzcnt (liczby procesów oczekuj±cych na osi±gniêcie przez semafor warto¶ci zero) zostanie zwiêkszona o 1. Proces bêdzie zawieszony a¿ do chwili, gdy spe³niony zostanie jeden z poni¿szych warunków:
- *
- semval osi±gnie warto¶æ 0; wówczas warto¶æ pola semzcnt zostanie zmniejszona o 1.
- *
- Zestaw semaforów zostanie usuniêty: system zg³osi b³±d, przypisuj±c zmiennej errno warto¶æ EIDRM.
- *
- Proces wywo³uj±cy funkcjê przechwyci sygna³: warto¶æ semzcnt zostanie zmniejszona o 1, natomiast system zg³osi b³±d, przypisuj±c zmiennej errno warto¶æ EINTR.
Je¶li sem_op ma warto¶æ mniejsz± od 0, to proces musi mieæ prawo do modyfikacji zestawu semaforów. Je¶li wówczas warto¶æ semafora semval jest wiêksza lub równa warto¶ci bezwzglêdnej sem_op, to operacja mo¿e byæ kontynuowana bezzw³ocznie: warto¶æ semafora semval zostanie zmniejszona o warto¶æ bezwzglêdn± sem_op. Ponadto, je¶li przekazano znacznik SEM_UNDO, wówczas system zaktualizuje licznik zmian semafora dla procesu (semadj). Je¶li warto¶æ bezwzglêdna sem_op jest wiêksza ni¿ semval, a w sem_flg przekazano znacznik IPC_NOWAIT, system zg³osi b³±d przypisuj±c zmiennej errno warto¶æ EAGAIN (i ¿adna z operacji z sops nie zostanie wykonana). W przeciwnym wypadku semncnt (licznik procesów oczekuj±cych na zwiêkszenie warto¶ci tego semafora) zostanie zwiêkszony o 1. Proces mo¿e byæ wznowiony w nastêpuj±cych sytuacjach:
- *
- semval osi±gnie warto¶æ wiêksz± lub równ± warto¶ci bezwzglêdnej sem_op; wtedy warto¶æ semncnt zostanie zmniejszona o 1, za¶ warto¶æ bezwzglêdna z sem_op zostanie odjêta od semval . Je¶li przekazany zosta³ znacznik SEM_UNDO , to system zaktualizuje licznik zmian semafora dla procesu (semadj).
- *
- Zestaw zostanie usuniêty z systemu: funkcja systemowa zg³osi b³±d, przypisuj±c zmiennej errno warto¶æ EIDRM.
- *
- Proces wywo³uj±cy funkcjê przechwyci sygna³: warto¶æ semncnt zostanie zmniejszona o 1, natomiast funkcja systemowa zg³osi b³±d, przypisuj±c zmiennej errno warto¶æ EINTR.
Je¶li operacja zostanie zakoñczona pomy¶lnie, to warto¶ci sempid ka¿dego z semaforów wyszczególnionych w tablicy wskazywanej przez sops przypisany zostanie identyfikator procesu (PID), który wywo³a³ semop. Ponadto, polu sem_otime przypisany zostanie aktualny czas. Funkcja semtimedop zachowuje siê tak samo jak funkcja semop, poza tym ¿e w tych przypadkach gdy proces wywo³uj±cy by spa³, czas trwania spania jest ograniczony przez czas okre¶lony w strukturze timespec, do której adres jest przekazywany w parametrze timeout. Je¶li osi±gniêto okre¶lony limit czasu, to wywo³anie systemowe zwraca b³±d, ustawiaj±c errno na EAGAIN (i ¿adna z operacji w sops nie jest wykonywana). Je¿eli parametr timeout jest NULL, to semtimedop zachowuje siê dok³adnie tak samo jak semop.
WARTO¦Æ ZWRACANA
Je¶li operacja zakoñczy siê pomy¶lnie, wówczas funkcja zwróci 0, a w przeciwnym wypadku zwróci -1, przypisuj±c zmiennej errno kod okre¶laj±cy rodzaj b³êdu.B£ÊDY
Po niepomy¶lnym zakoñczeniu, zmienna errno przyjmie jedn± z nastêpuj±cych warto¶ci:- E2BIG
- Warto¶æ nsops przekracza SEMOPM, maksymaln± liczbê operacji wykonywanych w jednym wywo³aniu.
- EACCES
- Proces nie ma uprawnieñ potrzebnych do wykonania jednej z podanych operacji.
- EAGAIN
- Operacja opatrzona znacznikiem IPC_NOWAIT w sem_flg nie mo¿e byæ natychmiast wykonana lub up³yn±³ limit czasu okre¶lony w parametrze timeout.
- EFAULT
- Adres wskazywany przez sops jest niedostêpny.
- EFBIG
- Numer semafora sem_num, do którego odnosi siê jedna z operacji, jest mniejszy od 0 albo wiêkszy lub równy liczbie semaforów w zestawie.
- EIDRM
- Zestaw zosta³ usuniêty z systemu.
- EINTR
- Podczas oczekiwania na wykonanie operacji proces przechwyci³ sygna³.
- EINVAL
- Zestaw semaforów nie istnieje lub warto¶æ semid jest mniejsza od 0 lub warto¶æ nsops nie jest liczb± dodatni±.
- ENOMEM
- Brak pamiêci na zapamiêtanie zmian wywo³anych przez operacjê (znacznik SEM_UNDO w sem_flg).
- ERANGE
- Dla pewnej operacji warto¶æ sem_op+semval przekroczy³a SEMVMX, zale¿n± od implementacji maksymaln± warto¶æ semval.
UWAGI
Struktury sem_undo nie s± dziedziczone poprzez wywo³ania funkcji systemowej fork(2), ale s± dziedziczone poprzez wywo³ania funkcji systemowej execve(2).semop nie jest nigdy automatycznie uruchamiana ponownie po jej przerwaniu przez funkcjê obs³ugi sygna³u, niezale¿nie od ustawieñ znacznika SA_RESTART podczas tworzenia funkcji obs³ugi sygna³u.
semadj jest przypisan± procesowi liczb± ca³kowit±, która stanowi po prostu (ujemny) licznik wszystkich operacji na semaforach wykonanych z podaniem znacznika SEM_UNDO. Podczas bezpo¶redniego nadawania warto¶ci semaforowi za pomoc± poleceñ SETVAL lub SETALL dla semctl(2), odpowiednie warto¶ci semadj dla wszystkich procesów s± zerowane.
Warto¶ci semval, sempid, semzcnt i semnct dla semafora mo¿na odczytaæ za pomoc± odpowiednich wywo³añ semctl(2).
Wywo³ania semop dotycz± nastêpuj±ce ograniczenia zasobów:
- SEMOPM
- Maksymalna liczba operacji, które mog± byæ wykonane w jednym wywo³aniu semop: (32).
- SEMVMX
- Maksymalna dozwolona warto¶æ semval: zale¿y od implementacji (32767).
Implementacja w systemie Linux nie nak³ada wewnêtrznych ograniczeñ na maksymaln± zmianê warto¶ci semafora podczas zakoñczenia procesu (SEMAEM), na ogólnosystemow± liczbê struktur przechowuj±cych informacje o zmianach stanu semaforów (SEMMNU), ani na maksymaln± dla procesu liczbê struktur przechowuj±cych informacje o zmianach stanu semaforów.
USTERKI
Gdy proces koñczy dzia³anie, zestaw skojarzonych z nim struktur semadj jest wykorzystywany do cofniêcia efektów wszystkich operacji na semaforach, które ten proces wykona³ z ustawionym znacznikiem SEM_UNDO. Wprowadza to trudno¶æ: je¿eli jedna (lub wiêcej) spo¶ród tych zmian semaforów spowodowa³by próbê zmniejszenia warto¶ci semafora poni¿ej zera, to co implementacja powinna uczyniæ? Jednym z mo¿liwych podej¶æ do tego zadadnienia mog³o by byæ zablokowanie do chwili, gdy przeprowadzenie wszystkich zmian semaforów bêdzie mo¿liwe. Jest to jednak¿e niepo¿±dane, gdy¿ spowodowa³oby wymuszenie zablokowania zakoñczenia procesu na dowolnie d³ugi okres. Inn± mo¿liwo¶ci± jest zignorowanie wszystkich takich zmian semaforów (nieco analogiczne do niepomy¶lnego zakoñczenia, gdy dla operacji na semaforze podany jest znacznik IPC_NOWAIT). Linux przyj±³ trzecie rozwi±zanie: zmniejszenie warto¶ci semafora na tyle, na ile jest to mo¿liwe (tzn. do zera) i umo¿liwienie natychmiastowej kontynuacji koñczenia dzia³ania procesu.ZGODNE Z
SVr4, SCID. SVr4 dokumentuje dodatkowe kody b³êdów: EINVAL, EFBIG i ENOSPC.ZOBACZ TAK¯E
ipc(5), semctl(2), semget(2), sigaction(2)Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre