Hello All!Вот тут появилась необходимость использовать семафоры. Где в Инете
можно прочитать про POSIX семафоры (пишу на Си)? Сам я к сожалению ничего не нашел :( Ткните носом пожалуйста...Прочитал тут недавно Стивенса "Взаимодействие процессов", но ни один из
примеров приведенных в книге не заработал, хотя код откомпилировал нормально. (юзаю ASPLinux7.3) Если кому интересно, могу привести исходник.
>Hello All!
>
>Вот тут появилась необходимость использовать семафоры. Где в Инете
>можно прочитать про POSIX семафоры (пишу на Си)? Сам я к сожалению
>ничего не нашел :( Ткните носом пожалуйста...
>
>Прочитал тут недавно Стивенса "Взаимодействие процессов", но ни один из
>примеров приведенных в книге не заработал, хотя код откомпилировал нормально. (юзаю ASPLinux7.3)
>Если кому интересно, могу привести исходник.Привет , попробуй вот это посмотреть - http://www.ecst.csuchico.edu/~beej/guide/ipc/semaphores.html
Я тоже работаю под аспом но особых проблем не встречал.
Посмотри ещё вот эту книгу http://www.advancedlinuxprogramming.com/alp-folder
Там есть глава о IPC в которой затрагиваеться тема семафоров.
Удачи!
>Привет , попробуй вот это посмотреть - http://www.ecst.csuchico.edu/~beej/guide/ipc/semaphores.html
Спасибо, обязательно гляну...>Я тоже работаю под аспом но особых проблем не встречал.
>Посмотри ещё вот эту книгу http://www.advancedlinuxprogramming.com/alp-folder
А вот это к сожалению не работает, но у меня эта книга есть в pdf.>Там есть глава о IPC в которой затрагиваеться тема семафоров.
>Удачи!
>Прочитал тут недавно Стивенса "Взаимодействие процессов", но ни один из
>примеров приведенных в книге не заработал, хотя код откомпилировал нормально. (юзаю ASPLinux7.3)
>Если кому интересно, могу привести исходник.Уважаемый berc, если Вам не трудно, приведите исходник.
Можно по почте: roman_shcherbak@yahoo.com
Что-то сомнительно, чтобы в Стивенсе были ошибки.P.S. И что значит - пример не заработал? Ошибки выдаются или что-то ещё?
>Уважаемый 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);
}
Уважаемый 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 работать не будут (только потоковые). Там же в Стивенсе чуть дальше есть пояснялка. Если очень хочется, то там же приведены способы эмуляции семафоров POSIX при помощи FIFO или разделяемой памяти.