The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

Распечатка 7.11 Операции с семафорами POSIX

Распечатка 7.11 Операции с семафорами POSIX

Предыдущая  Содержание  Следующая V*D*V

Распечатка 7.11.

 

/* sem.c */

 

#include <stdio.h>

#include <semaphore.h>

#include <sys/types.h>

#include <sys/mman.h>

#include <sys/stat.h>

#include <sys/fcntl.h>

#include <errno.h>

 

#define SEM_NAME "/mysem"

/*

 * Интерфейсы именованных семафоров вызываются в следующем порядке

 *    sem_open()

 *     ...

 *    sem_close()

 *    sem_unlink()

 * Интерфейсы неименованных семафоров вызываются в следующем порядке

 *    sem_init()

 *     ...

 *    sem_destroy()

 */

 

int main(){

  /* Наш именованный семафор */

  sem_t *sema_n;

  int ret,val;

 

  /*

   * Создаём именованный семафор (O_CREAT) с начальным значением 1

   * (то есть разблокирован)(Если вы хотите создать неименованный

   * семафор, то замените вызов sem_open на sem_init)

   */

  if ((sema_n = sem_open(SEM_NAME, O_CREAT, 0600, 1)) ==

                                            SEM_FAILED){

    perror("sem_open");

    return -1;

  }

 

  /* Получаем текущее значение семафора */

  sem_getvalue(sema_n, &val);

  printf("semaphore value = %d\n", val);

 

  /*

   * Пробуем получить семафор. Если не получается, используем

   * блокирующуюся версию. Это сделано только для того, чтобы

   * показать семантику и sem_trywait, и sem_wait. В реальном

   * коде не надо делать, как здесь.

   */

  if ((ret = sem_trywait(sema_n)) != 0 && errno == EAGAIN)

    /* permanent wait */

    sem_wait(sema_n);

  else if (ret != 0){

    perror("sem_trywait");

    return -1;

  }

 

  /*

   * Семафор захвачен. Работаем с общими данными.

   */

 

  /*

   * Освобождаем семафор после манипулирования общими данными

   */

  if (sem_post(sema_n) != 0)

    perror("post error");

 

  /*

   * Закрываем и удаляем семафор. (Для неименованных семафоров

   * замените следующие два вызова на sem_destroy. Для

   * неименованных семафоров sem_unlink не пригоден)

   */

  sem_close(sema_n);

  sem_unlink(SEM_NAME);

  return 0;

}

 

Предыдущая  Содержание  Следующая