>Уважаемый 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);
}