The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Каталог документации / Раздел "Документация для Linux" / Оглавление документа
next up previous contents index
Next: Операции над разделяемыми сегментами Up: Управление разделяемыми сегментами памяти Previous: Использование shmctl   Contents   Index

Программа-пример

        /* Программа иллюстрирует
           возможности системного вызова shmctl()
           (операции управления разделяемыми сегментами) */

        #include <stdio.h>
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>

        main ()
        {
          extern int errno;
          int rtrn, shmid, command, choice;
          struct shmid_ds shmid_ds, *buf;
          buf = &shmid_ds;

          /* Ввести идентификатор сегмента и действие */
          printf ("Введите идентификатор shmid: ");
          scanf ("%d", &shmid);

          printf ("Введите номер требуемого действия:\n");
          printf ("  IPC_STAT   = 1\n");
          printf ("  IPC_SET    = 2\n");
          printf ("  IPC_RMID   = 3\n");
          printf ("  SHM_LOCK   = 4\n");
          printf ("  SHM_UNLOCK = 5\n");
          printf ("  Выбор      = ");
          scanf ("%d", &command);

          /* Проверить значения */
          printf ("\nидентификатор = %d, действие = %d\n",
                  shmid, command);

          switch (command) {
            case 1:     /* Скопировать информацию
                           о состоянии разделяемого сегмента
                           в пользовательскую структуру
                           и вывести ее */

              rtrn = shmctl (shmid, IPC_STAT, buf);
              printf ("\nИд-р пользователя = %d\n",
                      buf->shm_perm.uid);
              printf ("Ид-р группы пользователя = %d\n",
                      buf->shm_perm.gid);
              printf ("Ид-р создателя = %d\n",
                      buf->shm_perm.cuid);
              printf ("Ид-р группы создателя = %d\n",
                      buf->shm_perm.cgid);
              printf ("Права на операции = 0%o\n",
                      buf->shm_perm.mode);
              printf ("Последовательность номеров ");
                      buf->shm_perm.cgid);
              printf ("используемых слотов = 0%x\n",
                      buf->shm_perm.seq);
              printf ("Ключ = 0%x\n", buf->shm_perm.key);
              printf ("Размер сегмента = %d\n", buf->shm_segsz);
              printf ("Выполнил последнюю операцию = %d\n",
                      buf->shm_lpid);
              printf ("Создал сегмент = %d\n", buf->shm_cpid);
              printf ("Число присоединивших сегмент = %d\n",
                      buf->shm_nattch);
              printf ("Число удерживаюших в памяти = %d\n",
                      buf->shm_cnattch);
              printf ("Последнее присоединение = %d\n",
                      buf->shm_atime);
              printf ("Последнее отсоединение = %d\n",
                       buf->shm_dtime);
              printf ("Последнее изменение = %d\n",
                       buf->shm_ctime);
              break;

            case 2:     /* Выбрать и изменить поле (поля)
                           ассоциированной структуры данных */
              /* Получить исходные значения структуры данных */
              rtrn = shmctl (shmid, IPC_STAT, buf);
              printf ("Введите номер изменяемого поля:\n");
              printf ("  shm_perm.uid  = 1\n");
              printf ("  shm_perm.gid  = 2\n");
              printf ("  shm_perm.mode = 3\n");
              printf ("  Выбор         = ");
              scanf ("%d", &choice);

              switch (choice) {
                case 1:
                  printf ("\nВведите ид-р пользователя: "),
                  scanf ("%d", &buf->shm_perm.uid);
                  printf ("\nИд-р пользователя = %d\n",
                          buf->shm_perm.uid);
                  break;

                case 2:
                  printf ("\nВведите ид-р группы: "),
                  scanf ("%d", &buf->shm_perm.gid);
                  printf ("\nИд-р группы = %d\n",
                          buf->shm_perm.uid);
                  break;

                case 3:
                  printf ("\nВведите восьмеричный код прав: ");
                  scanf ("%o", &buf->shm_perm.mode);
                  printf ("\nПрава на операции = 0%o\n",
                          buf->shm_perm.mode);
                  break;
              }

             /* Внести изменения */
             rtrn = shmctl (shmid, IPC_SET, buf);
             break;

          case 3:      /* Удалить идентификатор и
                          ассоциированную структуру данных */
            rtrn = shmctl (shmid, IPC_RMID, NULL);
            break;


          case 4:     /* Удерживать разделяемый сегмент
                         в памяти */
            rtrn = shmctl (shmid, SHM_LOCK, NULL);
            break;

          case 5:    /* Перестать удерживать сегмент в памяти */
            rtrn = shmctl (shmid, SHM_UNLOCK, NULL);
        }

        if (rtrn == -1) {
          /* Сообщить о неудачном завершении */
          printf ("\nshmctl завершился неудачей!\n");
          printf ("\nКод ошибки = %d\n", errno);
        }
        else {
          /* При успешном завершении сообщить ид-р shmid */
          printf ("\nshmctl завершился успешно, ");
          printf ("идентификатор shmid = %d\n", shmid);
        }

        exit (0);
      }



Alex Otwagin 2002-12-16



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру