Пытаюсь синхронизировать 5 процессов, они должны быть созданы от одного отца.
Я попытался вставить 5 идентификаторов ожидания, чтобы дождаться завершения дочернего процесса, но код никогда не достигает D4 и D5.
#include <unistd.h>
#include <semaphore.h>
#include <stdlib.h>
#include <sys/wait.h>
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);
int main() {
sem_t s1;
sem_t s2;
sem_init(&s1, 1, -1);
sem_init(&s2, 1, -1);
void (*arr[5])(sem_t, sem_t) = {func1, func2, func3, func4, func5};
int pid;
for (int i=0; i<5; i++) {
pid = fork();
if (pid == 0) {
arr[i](s1, s2);
break;
}
}
return 0;
}
void func1(sem_t sem1, sem_t sem2) {
system("echo D1");
sem_post(&sem1);
}
void func2(sem_t sem1, sem_t sem2) {
system("echo D2");
sem_post(&sem1);
}
void func3(sem_t sem1, sem_t sem2) {
system("echo D3");
sem_post(&sem2);
}
void func4(sem_t sem1, sem_t sem2) {
sem_wait(&sem1);
system("echo D4");
sem_post(&sem2);
}
void func5(sem_t sem1, sem_t sem2) {
sem_wait(&sem2);
system("echo D5");
}
Я ожидаю, что D4 будет показан после D1 и D2, а D5 будет показан последним (D3 не зависит от D1, D2, D4). Но мой код никогда не достигает D4, потому что функция фьютекса возвращает непредвиденную ошибку.
Выход:
The futex facility returned an unexpected error code.D1
D2
D3
int sem_init(sem_t *sem, int pshared, unsigned int value);
, обратите внимание наunsigned
. 2. передачаsem_t
по значению - person EOF   schedule 26.12.2018sem_init(&s1, 1, -1);
третий параметр должен быть значением без знака. Вот синтаксис со страницы MAN: ` int sem_init(sem_t *sem, int pshared, unsigned int value);` - person user3629249   schedule 27.12.2018main()
, перед оператором:return 0;
должен быть цикл, который содержит:while( wait( NULL ) != -1){;}
Чтобы родительский процесс не завершился до завершения всех дочерних процессов - person user3629249   schedule 27.12.2018