The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Семафоры POSIX"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Семафоры POSIX"
Сообщение от berc emailИскать по авторуВ закладки on 03-Апр-03, 18:14  (MSK)
Hello All!

Вот тут появилась необходимость использовать семафоры. Где в Инете
можно прочитать про POSIX семафоры (пишу на Си)? Сам я к сожалению ничего не нашел :(  Ткните носом пожалуйста...

Прочитал тут недавно Стивенса "Взаимодействие процессов", но ни один из
примеров приведенных в книге не заработал, хотя код откомпилировал нормально. (юзаю ASPLinux7.3) Если кому интересно, могу привести исходник.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Семафоры POSIX"
Сообщение от _alex emailИскать по авторуВ закладки on 04-Апр-03, 13:36  (MSK)
>Hello All!
>
>Вот тут появилась необходимость использовать семафоры. Где в Инете
>можно прочитать про POSIX семафоры (пишу на Си)? Сам я к сожалению
>ничего не нашел :(  Ткните носом пожалуйста...
>
>Прочитал тут недавно Стивенса "Взаимодействие процессов", но ни один из
>примеров приведенных в книге не заработал, хотя код откомпилировал нормально. (юзаю ASPLinux7.3)
>Если кому интересно, могу привести исходник.

Привет , попробуй вот это посмотреть  - http://www.ecst.csuchico.edu/~beej/guide/ipc/semaphores.html
Я тоже работаю под аспом но особых проблем не встречал.
Посмотри ещё вот эту книгу http://www.advancedlinuxprogramming.com/alp-folder
Там есть глава о IPC в которой затрагиваеться тема семафоров.
Удачи!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Семафоры POSIX"
Сообщение от berc emailИскать по авторуВ закладки on 07-Апр-03, 15:38  (MSK)
>Привет , попробуй вот это посмотреть  - http://www.ecst.csuchico.edu/~beej/guide/ipc/semaphores.html
Спасибо, обязательно гляну...

>Я тоже работаю под аспом но особых проблем не встречал.
>Посмотри ещё вот эту книгу http://www.advancedlinuxprogramming.com/alp-folder
А вот это к сожалению не работает, но у меня эта книга есть в pdf.

>Там есть глава о IPC в которой затрагиваеться тема семафоров.
>Удачи!


  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Семафоры POSIX"
Сообщение от romanSA Искать по авторуВ закладки on 07-Апр-03, 11:01  (MSK)
>Прочитал тут недавно Стивенса "Взаимодействие процессов", но ни один из
>примеров приведенных в книге не заработал, хотя код откомпилировал нормально. (юзаю ASPLinux7.3)
>Если кому интересно, могу привести исходник.

Уважаемый berc, если Вам не трудно, приведите исходник.
Можно по почте: roman_shcherbak@yahoo.com
Что-то сомнительно, чтобы в Стивенсе были ошибки.

P.S. И что значит - пример не заработал? Ошибки выдаются или что-то ещё?


  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Семафоры POSIX"
Сообщение от berc emailИскать по авторуВ закладки on 07-Апр-03, 15:36  (MSK)
>Уважаемый berc, если Вам не трудно, приведите исходник.
>Можно по почте: roman_shcherbak@yahoo.com
>Что-то сомнительно, чтобы в Стивенсе были ошибки.

Пожалуйста. Вот исходник, который создает именованный семафор:
#include "unpipc.h"

int main(int argc, char **argv)
{
int c, flags;
sem_t *sem;
unsigned int value;
int val;

flags = O_RDWR | O_CREAT;
value = 1;
while ( (c = getopt(argc, argv, "ei:")) != -1) {
switch (c) {
case 'e':
flags |= O_EXCL;
break;

case 'i':
value = atoi(optarg);
break;
}
}
if (optind != argc - 1)
write(2, "usage: semcreate [ -e ] [ -i initalvalue ] <name>", 51);

sem = sem_open(argv[optind], flags, FILE_MODE, value);

sem_close(sem);
exit(0);
}

А вот получение и вывод значения семафора:

#include "unpipc.h"

int main(int argc, char **argv)
{
sem_t *sem;
int sem1;
int val;

if (argc != 2)
write(2, "usage: semgetvalue <name>" ,25);

sem = sem_open(argv[1], 0);
sem_getvalue(sem, &val);
printf("value = %d\n", val);

exit(0);
}

>P.S. И что значит - пример не заработал? Ошибки выдаются или что-то
>ещё?

Компилируем все это дело:
gcc -lpthread -o semcreate semcreate.c
gcc -lpthread -o semgetvalue semgetvalue.c
Никаких сообщений не выдается...

Далее запускаем:
./semcreate /tmp/temp1
ls -l /tmp/temp1    ---> Нет такого файла или каталога
./semgetvalue /tmp/temp1  ---> Общая ошибка защиты
Вот собссно и все...
Еще меня смущает файлик unpipc.h, который поставляется с исходниками к книжке. В нем некоторые строчки пришлось закоментировать:

//#ifdef HAVE_SEMAPHORE_H
# include <semaphore.h> /* Posix semaphores */

//#ifndef SEM_FAILED
//#define SEM_FAILED ((sem_t *)(-1))
//#endif

//#endif
иначе проблемы. Пробовал обойтись и без unpipc.h, результат - результат
такой же.

Да, я тут победил SysV семафоры, описанные в этой же книжке. Вот что
получилось:
//semgetvalues.c
//#include "unpipc.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>


int main(int argc, char **argv)
{
int semid, nsems, i;
struct semid_ds mysemidds;
unsigned short *ptr;
union semun {
    int val;
    struct semid_ds *buf;
    ushort *array;
    struct seminfo *__buf;
    void *__pad;
}  arg;
//      ^^^^^^^^Это объединение дописывал сам, иначе не работает
//      Изначально было так: union semun arg; gcc ругался на arg...
//      Это как понимать?

if (argc != 2) {
write(2, "usage: semgetvalues <pathname>\n", 32); exit(1); }

/* 4first get the number of semaphores in the set */
semid = semget(ftok(argv[1], 'A'), 0, 0);
arg.buf = &mysemidds;
semctl(semid, 0, IPC_STAT, arg);
nsems = arg.buf->sem_nsems;

/* 4allocate memory to hold all the values in the set */
ptr = calloc(nsems, sizeof(unsigned short));
arg.array = ptr;

/* 4fetch the values and print */
semctl(semid, 0, GETALL, arg);
for (i = 0; i < nsems; i++)
printf("semval[%d] = %d\n", i, ptr[i]);

exit(0);
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Семафоры POSIX"
Сообщение от romanSA Искать по авторуВ закладки on 10-Апр-03, 12:57  (MSK)
Уважаемый berc, извините за долгий перерыв - у меня не было доступа к
почте и Инету.

По поводу семафоров SysV.
Согласно стандарту X/OPEN программист должен сам
определять этот тип как:
union semun {
  int val;                    /* value for SETVAL */
  struct semid_ds *buf;       /* buffer for IPC_STAT,
IPC_SET */
  unsigned short int *array;  /* array for GETALL,
SETALL */
  struct seminfo *__buf;      /* buffer for IPC_INFO
*/
... что-то ещё
};

По поводу семафоров POSIX:
посмотрите значение errno после вызова sem_open() или
его текстовое описание strerror(errno).
99% за то, что Вы получите следующее сообщение:
"Function not implemented" :(

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Семафоры POSIX"
Сообщение от yorik emailИскать по авторуВ закладки on 16-Апр-03, 10:04  (MSK)
Я эту книгу тоже читал и даже очень внимательно. Дело в том, что на твоей системе семафоры POSIX работать не будут (только потоковые). Там же в Стивенсе чуть дальше есть пояснялка. Если очень хочется, то там же приведены способы эмуляции семафоров POSIX при помощи FIFO или разделяемой памяти.
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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