睡眠理发算法 - 代码不执行

时间:2014-10-04 04:30:53

标签: c

我已经用了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;
}

2 个答案:

答案 0 :(得分:2)

等候室的填充速度太快了。

以下过程不会暂停并快速填充stdout无尽的&#34;&#34;等候室已满#34;。类似于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

&#34;工作&#34;代码跟随各种调试打印。

#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;
}

答案 1 :(得分:0)

在fork之后,每个进程都有自己的变量waitingRoomCust。

在这个区块中:

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

当变量waitingroomcust的值小于零时,不会发生任何其他事情,因为Nothing可以增加此变量

在这个区块中:

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

当变量waitingroomcust的值大于3时,不会发生任何其他事情,因为Nothing可以减少此变量

如果你想使用不同的过程,你需要建立一种沟通方式,它可以是一个fifo或信号。

如果你想使用共享内存,那么你需要线程,它们与进程类似,但共享相同的内存。

如果需要,我可以更详细地描述3种方法中的每一种