Заставьте форк выполнить одинаковое количество раз, бесконечно - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь сделать так, чтобы следующий код никогда не позволял сумме + быть больше суммы -. Я подумываю добавить простую строку из c sleep(1), но мне было любопытно узнать, есть ли лучший способ сделать суммы равными. Это должно остаться в бесконечном цикле.

int main(){
 if(fork() ==0)
    while(1){
       write(1,"-",1)
   }

  else
     while(1){

       write(1, "+",1);
   }

return 0;
}

Будет ли эта функция корректно работать с семафорами?

int main(){

int parent_sem = get_semaphore(0);
int child_sem = get_semaphore(1);

 if(fork() ==0)
    while(1){
        sem_wait(child_sem);
       write(1,"-",1);
       sem_signal(parent_sem);
   }

  else
     while(1){
       sem_wait(parent_sem);
       write(1, "+",1);
       sem_signal(child_sem);
   }

return 0;
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Вот исправленная версия вашего семафора.Я выделил разделяемую память так, чтобы к семафорам могли обращаться оба процесса через ответвление (я забыл, что это было необходимо, извините) и исправил типы семафоров и вызовы.

#include <unistd.h>
#include <semaphore.h>
#include <sys/mman.h>

int main() {
    // Create shared memory for two semaphores
    sem_t* sem = mmap(NULL, 2 * sizeof(sem_t), PROT_READ | PROT_WRITE,
                      MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    // Initialise parent and child semaphores: parent = 1, child = 0
    sem_t* parent_sem = sem;
    sem_t* child_sem = sem + 1;    
    sem_init(parent_sem, 1, 1);
    sem_init(child_sem, 1, 0);

    if (fork() == 0) {
        while(1) {
            // Child process
            sem_wait(child_sem);
            write(1, "-", 1);
            sem_post(parent_sem);
        }
    } else {
        while(1) {
            // Parent process
            sem_wait(parent_sem);
            write(1, "+", 1);
            sem_post(child_sem);
        }
    }

    return 0;
}
0 голосов
/ 06 июня 2019

Это близко (используйте сигналы):

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

void usr1handler() {
}

int main(void) {
        int pid;

        signal(SIGUSR1, usr1handler);

        if ((pid = fork()) == 0) {
                while (1) {
                        pause();
                        write(1, "-", 1);
                        fflush(stdout);
                        kill(getppid(), SIGUSR1);
                }
        }
        else {

                sleep(1);

                while (1) {
                        write(1, "+", 1);
                        fflush(stdout);
                        kill(pid, SIGUSR1);
                        pause();
                }
        }

}

Основной проблемой для этого является состояние гонки. Если процесс переходит к функции kill () до того, как другой переходит к pause (), программа останавливается. Это, вероятно, достаточно хорошо, чтобы начать вас, хотя. Я оставил там один сон, чтобы вы могли видеть, что он действительно печатается равномерно.

...