URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1557
[ Назад ]

Исходное сообщение
"Семафоры POSIX"

Отправлено berc , 03-Апр-03 18:14 
Hello All!

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

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


Содержание

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

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


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

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

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



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

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

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



"Семафоры POSIX"
Отправлено berc , 07-Апр-03 15:36 
>Уважаемый 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);
}


"Семафоры POSIX"
Отправлено romanSA , 10-Апр-03 12:57 
Уважаемый 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" :(


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