Мне нужно создать программу, которая синхронизирует два процесса, каждый из которых печатает только одну букву, так что всякий раз, когда мы наблюдаем вывод программы, разница между количеством "A"
и "B"
не превышает 2.
Так что это будет принято:
BAABBAABBABA
это не будет, потому что он печатает 4 B и только 2 A:
ABBABB
Итак, для начала я решил использовать семафоры POSIX.
Я создал два семафора, предоставив им все разрешения, используя sem_open
Затем я создал два дочерних процесса, и для каждого дочернего процесса я открыл семафоры, которые я создал, как описано на странице руководства для sem_open
, и манипулировал ими.
Я не думаю, что здесь виновата логика sem_post
и sem_wait
, поскольку программа, кажется, игнорирует их.
Итак, мой вопрос. Что идет не так?
Редактировать: мне действительно не нужно решение проблемы. Некоторое руководство будет высоко ценится и приветствуется в качестве ответа. Заранее спасибо!
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <semaphore.h>
int main(void){
sem_t *semA = sem_open("/semA", O_CREAT|O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO, 0); //Initialize semaphore(= 0) for process A
sem_t *semB = sem_open("/semB", O_CREAT|O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO, 0); //Initialize semaphore(= 0) for process B
if (fork()){ // parent process
if(fork()){}
else{
sem_t *childsemA = sem_open("/semA", 0);
sem_t *childsemB = sem_open("/semB", 0);
while(1){
printf("A");
sem_post(childsemB);
sem_wait(childsemA);
}
}
}
else{
sem_t *childsemA = sem_open("/semA", 0);
sem_t *childsemB = sem_open("/semB", 0);
while(1){
printf("B"); // child2 process
sem_post(childsemA);
sem_wait(childsemB);
}
}
return 0;
}
Выход: