Anonymous
Семафор ждать и отправлять сообщения с помощью вилки
Сообщение
Anonymous » 27 июл 2024, 21:24
Мне нужно создать 5 процессов, p2-p6, и установить порядок вывода p4, p3, p5, p1, p6, p2, и хоть убей, я не могу понять, почему sem_post не вызывает семафор, чтобы перестать ждать, но, видимо, я что-то не так понимаю:
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
int main(){
pid_t p2, p3, p4, p5, p6;
sem_t sem_p1, sem_p2, sem_p3, sem_p4, sem_p5, sem_p6;
sem_init(&sem_p1, 0, 0);
sem_init(&sem_p2, 0, 0);
sem_init(&sem_p3, 0, 0);
sem_init(&sem_p4, 0, 0);
sem_init(&sem_p5, 0, 0);
sem_init(&sem_p6, 0, 0);
p2 = fork();
if(p2 < 0){
perror("fork p1 -> p2 failed");
return 1;
}
if(p2 == 0){
printf("hi");
sem_wait(&sem_p2);
printf("p2 output");
return 0;
}
p3 = fork();
if(p3 < 0){
perror("fork p1 -> p3 failed");
return 1;
}
if(p3 == 0){
sem_wait(&sem_p3);
printf("p3 output");
sem_post(&sem_p5);
return 0;
}
p4 = fork();
if(p4 < 0){
perror("fork p1 -> p4 failed");
return 1;
}
if(p4 == 0){
sem_wait(&sem_p4);
printf("p4 output");
sem_post(&sem_p3);
return 0;
}
p5 = fork();
if(p5 < 0){
perror("fork p1 -> p5 failed");
return 1;
}
if(p5 == 0){
sem_wait(&sem_p5);
printf("p5 output");
sem_post(&sem_p1);
return 0;
}
p6 = fork();
if(p6 < 0){
perror("fork p1 -> p6 failed");
return 1;
}
if(p6 == 0){
sem_wait(&sem_p6);
printf("p6 output");
sem_post(&sem_p2);
return 0;
}
sem_post(&sem_p4);
sem_wait(&sem_p1);
printf("p1 output");
sem_post(&sem_p6);
return 0;
}
Я пытался получить выход p4, выход p3, выход p5, выход p1, выход p6, выход p2
Подробнее здесь:
https://stackoverflow.com/questions/788 ... -with-fork
1722104650
Anonymous
Мне нужно создать 5 процессов, p2-p6, и установить порядок вывода p4, p3, p5, p1, p6, p2, и хоть убей, я не могу понять, почему sem_post не вызывает семафор, чтобы перестать ждать, но, видимо, я что-то не так понимаю: [code]#include #include #include #include #include #include #include int main(){ pid_t p2, p3, p4, p5, p6; sem_t sem_p1, sem_p2, sem_p3, sem_p4, sem_p5, sem_p6; sem_init(&sem_p1, 0, 0); sem_init(&sem_p2, 0, 0); sem_init(&sem_p3, 0, 0); sem_init(&sem_p4, 0, 0); sem_init(&sem_p5, 0, 0); sem_init(&sem_p6, 0, 0); p2 = fork(); if(p2 < 0){ perror("fork p1 -> p2 failed"); return 1; } if(p2 == 0){ printf("hi"); sem_wait(&sem_p2); printf("p2 output"); return 0; } p3 = fork(); if(p3 < 0){ perror("fork p1 -> p3 failed"); return 1; } if(p3 == 0){ sem_wait(&sem_p3); printf("p3 output"); sem_post(&sem_p5); return 0; } p4 = fork(); if(p4 < 0){ perror("fork p1 -> p4 failed"); return 1; } if(p4 == 0){ sem_wait(&sem_p4); printf("p4 output"); sem_post(&sem_p3); return 0; } p5 = fork(); if(p5 < 0){ perror("fork p1 -> p5 failed"); return 1; } if(p5 == 0){ sem_wait(&sem_p5); printf("p5 output"); sem_post(&sem_p1); return 0; } p6 = fork(); if(p6 < 0){ perror("fork p1 -> p6 failed"); return 1; } if(p6 == 0){ sem_wait(&sem_p6); printf("p6 output"); sem_post(&sem_p2); return 0; } sem_post(&sem_p4); sem_wait(&sem_p1); printf("p1 output"); sem_post(&sem_p6); return 0; } [/code] Я пытался получить выход p4, выход p3, выход p5, выход p1, выход p6, выход p2 Подробнее здесь: [url]https://stackoverflow.com/questions/78801956/semaphore-wait-and-post-with-fork[/url]