Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

19 if (oflag & O_CREAT) {

20 va_start(ap, oflag); /* ар инициализируется последним явно указанным аргументом */

21 mode = va_arg(ap, va_mode_t) & ~S_IXUSR;

22 value = va_arg(ap, unsigned int);

23 va_end(ap);

24 /* открываем с указанием флага O_EXCL и установкой бита user-execute */

25 fd = open(pathname, oflag | O_EXCL | O_RDWR, mode | S_IXUSR);

26 if (fd < 0) {

27 if (errno == EEXIST && (oflag & O_EXCL) == 0)

28 goto exists; /* уже существует. OK */

29 else

30 return(SEM_FAILED);

31 }

32 created = 1;

33 /* кто создает файл, тот его и инициализирует */

34 /* установка размера файла */

35 bzero(&seminit, sizeof(seminit));

36 if (write(fd, &seminit, sizeof(seminit)) != sizeof(seminit))

37 goto err;

38 /* отображение файла в память */

39 sem = mmap(NULL, sizeof(mysem_t), PROT_READ | PROT_WRITE,

40 MAP_SHARED, fd, 0);

41 if (sem == MAP_FAILED)

42 goto err;

43 /* инициализация взаимного исключения, условной переменной, значения семафора */

44 if ((i = pthread_mutexattr_init(&mattr)) != 0)

45 goto pthreaderr;

46 pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);

47 i = pthread_mutex_init(&sem->sem_mutex, &mattr);

48 pthread_mutexattr_destroy(&mattr); /* не забыть удалить */

49 if (i != 0)

50 goto pthreaderr;

51 if ((i = pthread_condattr_init(&cattr)) != 0)

52 goto pthreaderr;

53 pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED);

54 i = pthread_cond_init(&sem->sem_cond, &cattr);

55 pthread_condattr_destroy(&cattr); /* не забыть удалить */

56 if (i != 0)

57 goto pthreaderr;

58 if ((sem->sem_count = value) > sysconf(_SC_SEM_VALUE_MAX)) {

59 errno = EINVAL;

60 goto err;

61 }

62 /* инициализация завершена, снимаем бит user-execute */

63 if (fchmod(fd, mode) == –1)

64 goto err;

65 close(fd);

66 sem->sem_magic = SEM_MAGIC;

67 return(sem);

68 }

Работа со списком аргументов переменной длины

19-23 Если при вызове функции указан флаг O_CREAT, мы должны принять четыре аргумента, а не два. Работа со списком аргументов переменной длины с помощью типа va_mode_t уже обсуждалась в связи с листингом 5.17, где мы использовали метод, аналогичный примененному здесь. Мы сбрасываем бит user-execute переменной mode (S_IXUSR) по причинам, которые вскоре будут раскрыты. Создается файл с указанным именем, и для него устанавливается бит user-execute.

Создание нового семафора и обработка потенциальной ситуации гонок

24-32 Если бы при указании флага O_CREAT мы просто открывали файл, отображали в память его содержимое и инициализировали поля структуры sem_t, у нас возникла бы ситуация гонок. Эта ситуация также уже обсуждалась в связи с листингом 5.17, и там мы воспользовались тем же методом, что и сейчас. Такая же ситуация гонок встретится нам, когда мы будем разбираться с листингом 10.37.

Установка размера файла

33-37 Мы устанавливаем размер созданного файла, записывая в него заполненную нулями структуру. Поскольку мы знаем, что только что созданный файл имеет размер 0, для установки его размера мы вызываем именно write, но не ftruncate, потому что, как мы отмечаем в разделе 13.3, Posix не гарантирует, что ftruncate срабатывает при увеличении размера обычных файлов. 

Отображение содержимого файла в память

38-42 Файл отображается в память вызовом mmap. Этот файл будет содержать текущее значение структуры типа sem_t, хотя, поскольку мы только что отобразили файл в память, мы обращаемся к нему через указатель, возвращаемый mmap, и никогда не вызываем read или write.

  • Читать дальше
  • 1
  • ...
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: