2014-10-04 2 views
3

Я сделал это за 10 минут и провел 2 часа, пытаясь понять, почему он ничего не сделает на терминале и, наконец, отказался и нуждался в помощи. Было бы очень приятно, если бы кто-нибудь мог помочь. Благодарю.алгоритм спящего парикмахера - код не исполняется

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <time.h> 

int main (int argc, char const *argv[]) 
{ 
    int waitingRoomCust = 0; 
    srand(time(NULL)); 
    int barber = fork(); 
    printf("%d\n",barber); 
    if (barber==0) { 
     while(1) { 
      if(waitingRoomCust > 0) { 
       waitingRoomCust--; 
       sleep((rand() % 12)); 
       printf("Customer has been given a haircut."); 
      } 
     } 
    } 
    if(barber!=0) { 
     while(1) { 
      if(waitingRoomCust <= 3) { 
       waitingRoomCust++; 
       printf("The waiting room has now %i customers.", waitingRoomCust); 
      } 
      else { 
       printf("Waiting room is full, customer has left."); 
      } 
     } 
    } 
    return 0; 
} 
+3

Время учиться использовать отладчик. – simonzack

+0

Нет вывода вообще? –

+0

Как вы общаетесь между родительским процессом и дочерним процессом? Использование 'fork()' создает процесс, а не поток. Переменные и память не разделяются между процессами. – SSC

ответ

2

Зал ожидания заполняется слишком быстро.

Следующий процесс не останавливается и быстро заполняет stdout с бесконечным "" зал ожидания полон». Похожие на if (barber==0) {

if(barber!=0) { 
    while(1) { 
    ... 
    } 
} 

должен обнаружить не удалось fork()barber < 0/

// if(barber!=0) { 
if (barber>0) { 
    ... 
} 
if(barber<0) { 
    printf("failed %i ", barber); 
} 

нужно общий объем памяти. См. https://stackoverflow.com/a/13274800/2410359

«Рабочий» код для Llows с различными отладочными отпечатками.

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/mman.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 

static int *waitingRoomCust; 

int main(int argc, char const *argv[]) { 
    waitingRoomCust = mmap(NULL, sizeof *waitingRoomCust, PROT_READ | PROT_WRITE, 
    MAP_SHARED | MAP_ANONYMOUS, -1, 0); 

    *waitingRoomCust = 01; 

    //srand(time(NULL)); 
    int barber = fork(); 
    printf("%d\n", barber); 
    fflush(stdout); 
    if (barber == 0) { 
    while (1) { 
     if (*waitingRoomCust > 0) { 
     (*waitingRoomCust)--; 
     printf("Customer has been given a haircut.\n"); 
     fflush(stdout); 
     sleep((rand() % 12)); 
     } else { 
     printf("sleep %d\n", *waitingRoomCust); 
     fflush(stdout); 
     sleep(1); 
     } 

    } 
    } 

    if (barber > 0) { 
    while (1) { 
     sleep(7); 
     if (*waitingRoomCust <= 3) { 
     (*waitingRoomCust)++; 
     printf("The waiting room has now %i customers.\n", *waitingRoomCust); 
     fflush(stdout); 
     } else { 
     printf("Waiting room is full, customer has left.\n"); 
     fflush(stdout); 
     } 
    } 
    } 
    if (barber < 0) { 
    printf("failed %i ", barber); 
    fflush(stdout); 
    } 
    return 0; 
} 
+0

это не сработает, потому что каждый процесс будет иметь свою собственную переменную и не будет иметь никакого способа связи. –

+1

@ Ответ на вопросник IvanIvanovich работает, поскольку chux использует разделяемую память (через mmap) для связи между двумя процессами. Как упоминалась [mmap man page] (http://man7.org/linux/man-pages/man2/mmap.2.html), и ссылка, предоставленная chux в его ответе. – SSC

+0

да, это сработает, спасибо, я не знал такого метода –

0

после вилки каждый процесс имеет свою собственную копию переменной waitingRoomCust.

в этом блоке:

 if(waitingRoomCust > 0) { 
      waitingRoomCust--; 
      sleep((rand() % 12)); 
      printf("Customer has been given a haircut."); 
     } 

, когда значение переменной waitingroomcust меньше нуля, больше ничего не будет происходить, не вызывают Ничто не может увеличить эту переменную

в этом блоке:

 if(waitingRoomCust <= 3) { 
      waitingRoomCust++; 
      printf("The waiting room has now %i customers.", waitingRoomCust); 
     } 

, когда значение переменной waitingroomcust больше 3, ничего больше никогда не произойдет, причина ничего не может уменьшить эту переменную

Если вы хотите использовать другой процесс, вам нужно сделать способ связи с ним, это может быть fifo или сигналы.

Если вы хотите использовать общую память, то вам нужны потоки, они похожи на процессы, но имеют одну и ту же память.

Если вам нужно, я могу более подробно описать каждый из 3 методов

Смежные вопросы