Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       semget - считывает идентификатор набора семафоров System V

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <sys/sem.h>

       int semget(key_t key, int nsems, int semflg);

ОПИСАНИЕ

       Системный  вызов  semget()  возвращает  идентификатор  набора  семафоров System V, связанный со значением
       аргумента key. Его можно использовать для получения идентификатора уже созданного набора семафоров  (если
       semflg равно нулю и значение key не равно IPC_PRIVATE) или для создания нового.

       Новый набор семафоров nsems создаётся, если значение key равно IPC_PRIVATE или с ключом key не связано ни
       одного существующего набора семафоров, а в semflg задано IPC_CREAT.

       Если  в  semflg  одновременно  указаны  IPC_CREAT и IPC_EXCL и набор семафоров для key уже существует, то
       semget() завершается с ошибкой и errno присваивается значение EEXIST (такой же результат как с O_CREAT  |
       O_EXCL у open(2)).

       При  создании  в  9  начальных битах аргумента semflg указываются права (владелец, группа и др.) на набор
       семафоров. Формат значения битов совпадает с аргументом mode вызова open(2) (но права на  выполнение  для
       семафоров ничего не означают, а права на запись означают право изменять значения семафоров).

       При  создании  нового  набора  семафоров  semget()  инициализирует связанную с семафором структуру данных
       semid_ds (см. semctl(2)) следующим образом:

       •  Полям sem_perm.cuid и sem_perm.uid присваиваются  значения  эффективного  идентификатора  пользователя
          вызывающего процесса.

       •  Полям   sem_perm.cgid   и  sem_perm.gid  присваиваются  значения  эффективного  идентификатора  группы
          вызывающего процесса.

       •  Младшим 9 битам sem_perm.mode присваивается значение младших 9 бит semflg.

       •  Полю sem_nsems присваивается значение nsems.

       •  Полю sem_otime присваивается значение 0.

       •  Полю sem_ctime присваивается значение текущего времени.

       Если набор семафоров не создаётся, то аргумент nsems может быть равен 0 (не  учитывать).  Иначе  аргумент
       nsems должен быть больше 0 и меньше или равен максимальному количеству семафоров в наборе (SEMMSL).

       Если набор семафоров уже существует, то проверяются права доступа.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       On  success,  semget()   returns the semaphore set identifier (a nonnegative integer).  On failure, -1 is
       returned, and errno is set to indicate the error.

ОШИБКИ

       EACCES Набор семафоров для ключа key существует, но вызывающий процесс не имеет прав доступа к нему и  не
              имеет  мандата CAP_IPC_OWNER в пространстве имён пользователя, который управляет его пространством
              имён IPC.

       EEXIST В semflg указаны IPC_CREAT и IPC_EXCL, но набор семафоров уже существует для key.

       EINVAL Значение nsems меньше  0  или  больше  максимально  возможного  для  набора  количества  семафоров
              (SEMMSL).

       EINVAL Набор  семафоров, соответствующий key, уже существует, но nsems больше, чем количество семафоров в
              этом наборе.

       ENOENT Для ключа key не существует набора семафоров и в semflg нет флага IPC_CREAT.

       ENOMEM Набор семафоров должен быть создан, но в системе не хватает памяти для  хранения  новой  структуры
              данных.

       ENOSPC Набор  семафоров  должен  быть  создан,  но  при этом будет превышен системный лимит на количество
              наборов семафоров (SEMMNI) или системный лимит на количество семафоров (SEMMNS).

СТАНДАРТЫ

       POSIX.1-2008.

ИСТОРИЯ

       SVr4, POSIX.1-2001.

ПРИМЕЧАНИЯ

       Значение IPC_PRIVATE не поле флага, а тип key_t. Если key равно этому специальному значению, то системный
       вызов игнорирует всё кроме 9-ти младших битов semflg  и  создаёт  новый  набор  семафоров  (при  успешном
       выполнении).

   Инициализация семафоров
       Значения  только  что  созданных семафоров не определены (в POSIX.1-2001 и POSIX.1-2008 это указано явно,
       хотя в  POSIX.1-2008  сказано,  что  в  будущих  версиях  стандарта  от  реализации  может  потребоваться
       инициализировать  семафоры  0).  Хотя  Linux,  подобно многим другим реализациям, инициализирует семафоры
       значением 0, переносимое приложение не может полагаться на это: оно должно явно инициализировать семафоры
       нужным значением.

       Инициализацию можно выполнять с помощью semctl(2) с операцией SETVAL или SETALL. При  наличии  нескольких
       абонентов  неизвестно,  кто  первый  выполнит  инициализацию,  и  чтобы  избежать  состязательности нужно
       проверять sem_otime на ненулевое значение в связанной структуре данных, получаемой с помощью semctl(2)  и
       операции IPC_STAT.

   Ограничения семафоров
       Ниже приведены ограничения на ресурсы набора семафоров, оказывающие влияние на вызов semget():

       SEMMNI System-wide  limit on the number of semaphore sets.  Before Linux 3.19, the default value for this
              limit was 128.  Since Linux 3.19, the default value is 32,000.  On Linux, this limit can  be  read
              and modified via the fourth field of /proc/sys/kernel/sem.

       SEMMSL Maximum  number  of  semaphores  per  semaphore ID.  Before Linux 3.19, the default value for this
              limit was 250.  Since Linux 3.19, the default value is 32,000.  On Linux, this limit can  be  read
              and modified via the first field of /proc/sys/kernel/sem.

       SEMMNS Ограничение  на  максимальное  количество  семафоров  в  системе: зависит от политики (в Linux это
              ограничение можно получать и  изменять  через  второе  поле  /proc/sys/kernel/sem).  Заметим,  что
              количество семафоров в системе также ограничено произведением SEMMSL и SEMMNI.

ОШИБКИ

       Имя IPC_PRIVATE, возможно, было выбрано неудачно, IPC_NEW отражает смысл действия более ясно.

ПРИМЕРЫ

       The  program  shown  below uses semget()  to create a new semaphore set or retrieve the ID of an existing
       set.  It generates the key for semget() using ftok(3).  The first two command-line arguments are used  as
       the  pathname  and  proj_id  arguments  for  ftok(3).  The third command-line argument is an integer that
       specifies the nsems argument for semget().  Command-line options can be used  to  specify  the  IPC_CREAT
       (-c)   and  IPC_EXCL  (-x)   flags  for  the call to semget().  The usage of this program is demonstrated
       below.

       We first create two files that will be used to generate keys using ftok(3),  create  two  semaphore  sets
       using those files, and then list the sets using ipcs(1):

           $ touch mykey mykey2
           $ ./t_semget -c mykey p 1
           ID = 9
           $ ./t_semget -c mykey2 p 2
           ID = 10
           $ ipcs -s

           ------ Semaphore Arrays --------
           key        semid      owner      perms      nsems
           0x7004136d 9          mtk        600        1
           0x70041368 10         mtk        600        2

       Next,  we  demonstrate  that when semctl(2)  is given the same key (as generated by the same arguments to
       ftok(3)), it returns the ID of the already existing semaphore set:

           $ ./t_semget -c mykey p 1
           ID = 9

       Finally, we demonstrate the kind of collision that can occur when ftok(3)  is  given  different  pathname
       arguments that have the same inode number:

           $ ln mykey link
           $ ls -i1 link mykey
           2233197 link
           2233197 mykey
           $ ./t_semget link p 1       # Generates same key as 'mykey'
           ID = 9

   Исходный код программы

       /* t_semget.c

          Licensed under GNU General Public License v2 or later.
       */
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/ipc.h>
       #include <sys/sem.h>
       #include <unistd.h>

       static void
       usage(const char *pname)
       {
           fprintf(stderr, "Usage: %s [-cx] pathname proj-id num-sems\n",
                   pname);
           fprintf(stderr, "    -c           Use IPC_CREAT flag\n");
           fprintf(stderr, "    -x           Use IPC_EXCL flag\n");
           exit(EXIT_FAILURE);
       }

       int
       main(int argc, char *argv[])
       {
           int    semid, nsems, flags, opt;
           key_t  key;

           flags = 0;
           while ((opt = getopt(argc, argv, "cx")) != -1) {
               switch (opt) {
               case 'c': flags |= IPC_CREAT;   break;
               case 'x': flags |= IPC_EXCL;    break;
               default:  usage(argv[0]);
               }
           }

           if (argc != optind + 3)
               usage(argv[0]);

           key = ftok(argv[optind], argv[optind + 1][0]);
           if (key == -1) {
               perror("ftok");
               exit(EXIT_FAILURE);
           }

           nsems = atoi(argv[optind + 2]);

           semid = semget(key, nsems, flags | 0600);
           if (semid == -1) {
               perror("semget");
               exit(EXIT_FAILURE);
           }

           printf("ID = %d\n", semid);

           exit(EXIT_SUCCESS);
       }

СМОТРИТЕ ТАКЖЕ

       semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), sysvipc(7)

ПЕРЕВОД

       Русский  перевод  этой  страницы  руководства разработал(и) Alexander Golubev <fatzer2@gmail.com>, Azamat
       Hackimov  <azamat.hackimov@gmail.com>,  Hotellook,   Nikita   <zxcvbnm3230@mail.ru>,   Spiros   Georgaras
       <sng@hellug.gr>,  Vladislav  <ivladislavefimov@gmail.com>,  Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов
       <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот перевод является свободной программной документацией; он распространяется на условиях  общедоступной
       лицензии  GNU  (GNU  General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите  об  этом
       разработчику(ам)   по   его(их)  адресу(ам)  электронной  почты  или  по  адресу  списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  15 июня 2024 г.                                       semget(2)