2014-10-04 25 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 2014-10-04 04:32:11

+0

根本沒有輸出? – 2014-10-04 04:39:03

+0

你如何在父進程和子進程之間進行通信?使用'fork()'創建進程不是線程。變量和內存不在進程之間共享。來自man fork()的 – SSC 2014-10-04 04:39:14

回答

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

「工作」 代碼FO用各種調試打印。

#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

它不會工作,因爲每個進程都會有自己的變量,不會有任何的溝通方式 – 2014-10-04 06:40:05

+1

@IvanIvanovich chux的回答不工作作爲chux使用共享內存(MMAP通過)兩個進程之間的通信。正如[mmap手冊頁](http://man7.org/linux/man-pages/man2/mmap.2.html)中提到的,以及chux在他的回答中提供的鏈接。 – SSC 2014-10-04 10:35:32

+0

是的,它會工作,謝謝你,我不知道這樣的方法 – 2014-10-04 12:35:05

0

在fork之後,每個進程都有自己的變量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種方法中的每種方法