我正在尝试同步 5 个进程,它们必须由同一个父亲创建。
我尝试插入 5 个 waitpid 来等待子进程结束,但代码永远不会到达 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,因为 futex 工具返回了一个意外错误。
输出:
The futex facility returned an unexpected error code.D1
D2
D3