Вы передаете семафоры по значению , что неверно, поскольку переменная sem_t
в каждой функции является копией оригинала.(Вот почему такие функции, как sem_init()
, sem_post()
и sem_wait()
, все принимают адреса семафора в качестве аргумента.)
Вам необходимо передать семафоры address , поэтому каждая функция работает с исходными семафорами:
void func1(sem_t *sem1, sem_t *sem2);
void func2(sem_t *sem1, sem_t *sem2);
void func3(sem_t *sem1, sem_t *sem2);
void func4(sem_t *sem1, sem_t *sem2);
void func5(sem_t *sem1, sem_t *sem2);
и
void (*arr[5])(sem_t *, sem_t *) = {func1, func2, func3, func4, func5};
И вызывает функцию как:
arr[i](&s1, &s2);
Затем функции должны иметь вид:
void func1(sem_t *sem1, sem_t *sem2) {
system("echo D1");
sem_post(sem1);
}
Обратите внимание, что адрес, переданный func1()
, передается непосредственно sem_post()
.
Редактировать:
Как уже отмечали другие, вы неправильно инициализируете семафоры.Вы не можете инициализировать семафор с отрицательным значением.
Правильные общие семафоры
Как отмечено в комментариях, семфоры не находятся в памяти, разделяемой между несколькимипроцессов.
Один из способов поместить семфоры в разделяемую память - использовать mmap()
:
#include <sys/mman.h>
int main() {
...
// map a 4k page of shared memory (assumes a sem_t is small
// enough to fit at least two)
void *sharedMem = mmap( 0, 4 * 1024, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0 );
// use the mmap()'d memory as shared semphores
sem_t *semArray = ( sem_t * ) sharedMem;
// initialize the semaphores
sem_init( &( semArray[ 0 ] ), 1, 0 );
sem_init( &( semArray[ 1 ] ), 1, 0 );
Код вызова становится
arr[i](&( semArray[ 0 ] ), &( semArray[ 1 ] ));