Provided by: manpages-pl-dev_4.13-4_all bug

NAZWA

       semctl - sterowanie semaforami Systemu V

SKŁADNIA

       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/sem.h>

       int semctl(int semid, int semnum, int cmd, ...);

OPIS

       semctl()  wykonuje  operację sterującą określoną przez cmd na zestawie semaforów Systemu V
       określonym przez semid lub na semaforze  o  numerze  semnum  z  tego  zestawu.  (Numeracja
       semaforów w zestawie semaforów zaczyna się od 0).

       W  zależności  od  cmd  funkcja  przyjmuje  trzy lub cztery argumenty. Jeśli są cztery, to
       czwarty jest typu union semun. Program wywołujący musi zdefiniować tę unię jako:

           union semun {
               int              val;    /* Wartość dla SETVAL */
               struct semid_ds *buf;    /* Bufor dla IPC_STAT, IPC_SET */
               unsigned short  *array;  /* Tablica dla GETALL, SETALL */
               struct seminfo  *__buf;  /* Bufor dla IPC_INFO
                                           (specyficzne dla Linuksa) */
           };

       Struktura danych semid_ds jest zdefiniowana w <sys/sem.h> następująco:

           struct semid_ds {
               struct ipc_perm sem_perm;  /* Ownership and permissions */
               time_t          sem_otime; /* Last semop time */
               time_t          sem_ctime; /* Creation time/time of last
                                             modification via semctl() */
               unsigned long   sem_nsems; /* No. of semaphores in set */
           };

       Pola struktury semid_ds są następujące:

       sem_perm   This is an ipc_perm structure (see below) that specifies the access permissions
                  on the semaphore set.

       sem_otime  Czas ostatniego wywołania funkcji systemowej semop(2).

       sem_ctime  Time  of creation of semaphore set or time of last semctl()  IPCSET, SETVAL, or
                  SETALL operation.

       sem_nsems  Liczba semaforów w zestawie. Każdy semafor zestawu  jest  identyfikowany  przez
                  nieujemną liczbę całkowitą z zakresu od 0 do sem_nsems-1.

       Struktura  ipc_perm jest zdefiniowana następująco (wyróżnione pola można ustawić za pomocą
       IPC_SET):

           struct ipc_perm {
               key_t          __key; /* Klucz podany w semget(2) */
               uid_t          uid;   /* Efektywny UID właściciela */
               gid_t          gid;   /* Efektywny GID właściciela */
               uid_t          cuid;  /* Efektywny UID twórcy */
               gid_t          cgid;  /* Efektywny GID twórcy */
               unsigned short mode;  /* Uprawnienia */
               unsigned short __seq; /* Numer sekwencji */
           };

       The least significant 9 bits of the mode field of the ipc_perm structure define the access
       permissions for the shared memory segment.  The permission bits are as follows:

       0400   Read by user
       0200   Write by user
       0040   Read by group
       0020   Write by group
       0004   Read by others
       0002   Write by others

       In  effect,  "write"  means  "alter"  for a semaphore set.  Bits 0100, 0010, and 0001 (the
       execute bits) are unused by the system.

       Poprawne wartości parametru cmd to:

       IPC_STAT
              Kopiuje informacje ze struktury kontrolnej jądra skojarzonej z semid  do  struktury
              semid_ds  wskazywanej  przez arg.__buf. Argument semnum jest ignorowany. Wywołujący
              musi mieć uprawnienie odczytu zestawu semaforów.

       IPC_SET
              Write the values of some members of the semid_ds structure pointed to by arg.buf to
              the  kernel  data  structure  associated with this semaphore set, updating also its
              sem_ctime member.

              The following members of the structure are updated: sem_perm.uid, sem_perm.gid, and
              (the least significant 9 bits of)  sem_perm.mode.

              The  effective  UID  of the calling process must match the owner (sem_perm.uid)  or
              creator (sem_perm.cuid)  of the semaphore set, or the caller  must  be  privileged.
              The argument semnum is ignored.

       IPC_RMID
              Usuwa  natychmiast  zestaw  semaforów.  Wznawia  wszystkie  procesy  zablokowane  w
              wywołaniu semop(2) (wywołanie to zasygnalizuje  błąd  i  ustawi  zmienną  errno  na
              EIDRM).  Efektywny  identyfikator  użytkownika procesu wywołującego musi odpowiadać
              twórcy  lub  właścicielowi  zestawu  semaforów  albo  proces  wywołujący  musi  być
              uprzywilejowany. Argument semnum jest pomijany.

       IPC_INFO (specyficzne dla Linuksa)
              Zwraca  w  strukturze,  na  którą  wskazuje  arg.__buf,  informacje  o  systemowych
              ograniczeniach  i  parametrach  semaforów.  Struktura  jest  typu  seminfo  i  jest
              zdefiniowana   w   <sys/shm.h>,   pod  warunkiem,  że  zdefiniowano  również  makro
              _GNU_SOURCE:

                  struct  seminfo {
                      int semmap;  /* Liczba wpisów w mapie semaforów
                                      nieużywane przez jądro */
                      int semmni;  /* Maksymalna liczba zestawów semaforów */
                      int semmns;  /* Maksymalna liczba semaforów we wszystkich
                                      zestawach semaforów */
                      int semmnu;  /* Maksymalna liczba struktur wycofania (undo)
                                      w systemie; nieużywane przez jądro*/
                      int semmsl;  /* Maksymalna liczba semaforów
                                      w zestawie */
                      int semopm;  /* Maksymalna liczba operacji dla
                                      semop(2) */
                      int semume;  /* Maksymalna liczba wpisów wycofania (undo)
                                      procesu; nieużywane przez jądro */
                      int semusz;  /* Rozmiar struktury sem_undo */
                      int semvmx;  /* Maksymalna wartość semafora */
                      int semaem;  /* Maksymalna wartość możliwa do zapamiętania
                                      dla regulacji semafora (SEM_UNDO) */
                  };

              Ustawienia semmsl, semmns, semopm oraz semmni można  zmienić  za  pomocą  plików  w
              /proc/sys/kernel/sem; szczegóły można znaleźć w podręczniku proc(5).

       SEM_INFO (specyficzne dla Linuksa)
              Zwraca  strukturę seminfo zawierającą te same informacje co w przypadku IPC_INFO, z
              tym  wyjątkiem, że  w  następujących  polach  zwracane  są  informacje  o  zasobach
              systemowych  wykorzystywanych  przez  semafory:  pole semusz zwraca liczbę zestawów
              semaforów istniejących obecnie w systemie;  pole  semaem  zwraca  całkowitą  liczbę
              semaforów we wszystkich zestawach semaforów w systemie.

       SEM_STAT (specyficzne dla Linuksa)
              Zwraca  strukturę semid_ds, taką jak dla IPC_STAT. Jednakże parametr semid nie jest
              identyfikatorem segmentu, ale indeksem  wewnętrznej  tablicy  jądra  przechowującej
              informacje o wszystkich segmentach zestawach semaforów w systemie.

       SEM_STAT_ANY (Linux-specific, since Linux 4.17)
              Return  a  seminfo  structure  containing  the  same  information  as for SEM_STAT.
              However, sem_perm.mode is not checked for read access for semid  meaning  that  any
              user  can  employ  this  operation  (just as any user may read /proc/sysvipc/sem to
              obtain the same information).

       GETALL Zwraca (bieżącą) wartość semval dla wszystkich semaforów z zestawu, umieszczając je
              w  tablicy  arg.array.  Argument  semnum jest pomijany. Proces wywołujący musi mieć
              prawa do odczytu zestawu semaforów.

       GETNCNT
              Return the semncnt value for the semnum-th semaphore of the set (i.e.,  the  number
              of  processes  waiting for the semaphore's value to increase).  The calling process
              must have read permission on the semaphore set.

       GETPID Zwraca wartość sempid skojarzoną z semaforem o numerze semnum w zestawie.  Jest  to
              identyfikator  procesu,  który wykonał ostatnią operację na tym semaforze (ale zob.
              UWAGI). Proces wywołujący musi mieć prawa do odczytu zestawu semaforów.

       GETVAL Return semval (i.e., the semaphore value) for the semnum-th semaphore of  the  set.
              The calling process must have read permission on the semaphore set.

       GETZCNT
              Return  the  semzcnt value for the semnum-th semaphore of the set (i.e., the number
              of processes waiting for the semaphore value to become  0).   The  calling  process
              must have read permission on the semaphore set.

       SETALL Set  the semval values for all semaphores of the set using arg.array, updating also
              the sem_ctime member of the semid_ds  structure  associated  with  the  set.   Undo
              entries  (see  semop(2))   are cleared for altered semaphores in all processes.  If
              the changes to semaphore values would  permit  blocked  semop(2)   calls  in  other
              processes  to  proceed,  then those processes are woken up.  The argument semnum is
              ignored.  The calling process must have alter (write) permission on  the  semaphore
              set.

       SETVAL Set the semaphore value (semval) to arg.val for the semnum-th semaphore of the set,
              updating also the sem_ctime member of the semid_ds structure  associated  with  the
              set.   Undo  entries  are  cleared for altered semaphores in all processes.  If the
              changes to semaphore values would permit blocked semop(2)  calls in other processes
              to proceed, then those processes are woken up.  The calling process must have alter
              permission on the semaphore set.

WARTOŚĆ ZWRACANA

       W razie błędu semctl() zwraca -1, a zmiennej errno  zostanie  nadana  wartość  określająca
       rodzaj błędu.

       W przeciwnym przypadku zwrócona zostanie nieujemna wartość zależna od parametru cmd:

       GETNCNT
              wartość semncnt.

       GETPID wartość sempid.

       GETVAL wartość semval.

       GETZCNT
              wartość semzcnt.

       IPC_INFO
              the  index  of  the  highest  used  entry  in the kernel's internal array recording
              information about all semaphore sets.  (This information can be used with  repeated
              SEM_STAT  or SEM_STAT_ANY operations to obtain information about all semaphore sets
              on the system.)

       SEM_INFO
              tak jak IPC_INFO.

       SEM_STAT
              identyfikator zestawu semaforów, którego indeks został podany w semid.

       SEM_STAT_ANY
              tak jak SEM_STAT.

       Dla wszystkich pozostałych wartości cmd w razie pomyślnego zakończenia zwracane jest 0.

BŁĘDY

       W przypadku niepowodzenia,  zmiennej  errno  zostanie  przypisana  jedna  z  następujących
       wartości:

       EACCES The  argument  cmd  has one of the values GETALL, GETPID, GETVAL, GETNCNT, GETZCNT,
              IPC_STAT, SEM_STAT, SEM_STAT_ANY, SETALL, or SETVAL and the  calling  process  does
              not  have  the  required  permissions  on  the  semaphore set and does not have the
              CAP_IPC_OWNER capability in the user namespace that governs its IPC namespace.

       EFAULT Adres wskazywany przez arg.buf lub arg.array jest niedostępny.

       EIDRM  Zestaw semaforów został usunięty.

       EINVAL Niepoprawna wartość parametru cmd lub semid. Albo: w  przypadku  operacji  SEM_STAT
              wartość  indeksu  podana  w parametrze semid odwoływała się do obecnie nieużywanego
              elementu tablicy.

       EPERM  Parametr cmd  jest  równy  IPC_SET  lub  IPC_RMID,  ale  identyfikator  efektywnego
              użytkownika  procesu  wywołującego nie jest twórcą (określonym w sem_perm.cuid) ani
              właścicielem (określonym  w  sem_perm.uid)  zestawu  semaforów,  a  proces  nie  ma
              ustawionego atrybutu CAP_SYS_ADMIN.

       ERANGE Argument cmd ma wartość SETALL lub SETVAL, ale przekazywana wartość semafora semval
              (dla któregoś z semaforów zestawu) jest mniejsza  od  0  lub  większa  od  wartości
              ograniczenia systemowego SEMVMX.

ZGODNE Z

       POSIX.1-2001, POSIX.1-2008, SVr4.

       POSIX.1  określa  pole  sem_nsems struktury semid_ds jako będące typu unsigned short i tak
       też jest ono zdefiniowane w większości  systemów.  Tak  było  również  w  Linuksie  2.2  i
       wcześniejszych, lecz od Linuksa 2.4 pole to jest typu unsigned long.

UWAGI

       Dołączenie  <sys/types.h>  i  <sys/ipc.h>  nie jest wymagane na Linuksie ani przez żadną z
       wersji  POSIX.  Jednak  niektóre  stare  implementacje  wymagają  dołączenia  tych  plików
       nagłówkowych,  SVID również dokumentuje ich dołączenie. Aplikacje które mają być przenośne
       na tego typu stare systemy mogą wymagać dołączenia omawianych plików nagłówkowych.

       Operacje IPC_INFO, SEM_STAT  oraz  SEM_INFO  są  używane  przez  program  ipcs(1)  w  celu
       dostarczenia  informacji  o  zajmowanych  zasobach.  W przyszłości operacje te mogą zostać
       zmodyfikowane lub przeniesione do interfejsu systemu plików /proc.

       Niektóre pola struktury struct semid_ds były w Linuksie 2.2 typu short, ale stały się typu
       long  w Linuksie 2.4. Aby to wykorzystać, powinna wystarczyć rekompilacja pod glibc-2.1.91
       lub nowszą. (Jądro rozróżnia stare wywołania od nowych za pomocą znacznika IPC_64 w cmd).

       We wcześniejszych wersjach biblioteki glibc unia semun była  zdefiniowana  w  <sys/sem.h>,
       jednakże  POSIX.1  wymaga,  żeby  to  program wywołujący definiował tę unię. Wersje glibc,
       które nie definiują tej unii, definiują makro _SEM_SEMUN_UNDEFINED w <sys/sem.h>.

       Na  wywołanie  semctl()  wpływa  następujące  ograniczenie  systemowe   dotyczące   zbioru
       semaforów:

       SEMVMX Maksymalna wartość semval: zależna od implementacji (32767).

       W  celu  uzyskania  lepszej  przenośności,  najlepiej zawsze wywoływać semctl() z czterema
       argumentami.

   Wartość sempid
       POSIX.1 definiuje sempid jako "identyfikator procesu ostatniej operacji"  na  semaforze  i
       wprost  zauważa,  że  wartość  tak  jest  ustawiana  przez  pomyślne wywołanie semop(2), z
       implikacją, że żaden inny interfejs nie wpływa na wartość sempid.

       Choć niektóre implementacje są zgodne z zachowaniem opisanym w POSIX.1,  to  inne  nie  są
       (błąd  prawdopodobnie  leży  tu  w  specyfikacji  POSIX.1,  jako że nie zauważyła ona tylu
       przykładów  istniejących  implementacji).  Różne  inne  implementacje  aktualizują  sempid
       również  przy  innych  operacjach  aktualizujących  wartość  semafora: operacjach SETVAL i
       SETALL, jak również dostosowaniach semafora wykonywanych  przy  zakończeniu  procesu  jako
       konsekwencji użycia flagi SEM_UNDO (zob. semop(2)).

       Linux  also  updates  sempid  for  SETVAL  operations and semaphore adjustments.  However,
       somewhat inconsistently, up to and including Linux 4.5, the kernel did not  update  sempid
       for SETALL operations.  This was rectified in Linux 4.6.

PRZYKŁADY

       See shmop(2).

ZOBACZ TAKŻE

       ipc(2), semget(2), semop(2), capabilities(7), sem_overview(7), sysvipc(7)

O STRONIE

       Angielska  wersja  tej  strony  pochodzi  z  wydania  5.10  projektu Linux man-pages. Opis
       projektu, informacje dotyczące zgłaszania błędów oraz  najnowszą  wersję  oryginału  można
       znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

T◈UMACZENIE

       Autorami   polskiego   tłumaczenia   niniejszej   strony  podręcznika  są:  Rafał  Lewczuk
       <R.Lewczuk@elka.pw.edu.p>,  Andrzej  Krzysztofowicz   <ankry@green.mf.pg.gda.pl>,   Robert
       Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją. Bliższe informacje o warunkach licencji
       można   uzyskać   zapoznając   się   z   GNU   General   Public   License   w   wersji   3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   lub   nowszej.   Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej
       ⟨manpages-pl-list@lists.sourceforge.net⟩.