semop

Autres langues

Langue: pl

Autres versions - même langue

Version: 2003-04-28 (openSuse - 09/10/07)

Section: 2 (Appels système)

NAZWA

semop, semtimedop - operacje na semaforach

SK£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)