Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 睡眠理发师算法-代码未执行_C - Fatal编程技术网

C 睡眠理发师算法-代码未执行

C 睡眠理发师算法-代码未执行,c,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; sr

我在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;
}
#包括
#包括
#包括
#包括
int main(int argc,char const*argv[]
{
int waitingRoomCust=0;
srand(时间(空));
int barber=fork();
printf(“%d\n”,barber);
如果(理发师==0){
而(1){
如果(waitingRoomCust>0){
等候室顾客--;
睡眠((rand()%12));
printf(“客户已理发”);
}
}
}
如果(理发师!=0){
而(1){

如果(waitingRoomCust等候室的人太多了

下面的过程不会暂停,并会用无休止的“等候室已满”快速填充
stdout
。类似于
if(barber==0){

应检测失败的
fork()
理发师<0
/

// if(barber!=0) {
if (barber>0) {
  ...
}
if(barber<0) {
  printf("failed %i ", barber);
}
//如果(理发师!=0){
如果(理发师>0){
...
}
如果(理发师0){
(*候机室客户)--;
printf(“客户已被理发。\n”);
fflush(stdout);
睡眠((rand()%12));
}否则{
printf(“睡眠%d\n”,*waitingRoomCust);
fflush(stdout);
睡眠(1);
}
}
}
如果(理发师>0){
而(1){
睡眠(7);

如果(*waitingRoomCust在fork之后,则每个进程都有自己的变量waitingRoomCust副本

在该区块中:

        if(waitingRoomCust > 0) {
            waitingRoomCust--;
            sleep((rand() % 12));
            printf("Customer has been given a haircut.");
        }
        if(waitingRoomCust <= 3) {
            waitingRoomCust++;
            printf("The waiting room has now %i customers.", waitingRoomCust);
        }
当变量waitingroomcust的值小于零时,不会发生任何其他情况,因为没有任何东西可以增加此变量

在该区块中:

        if(waitingRoomCust > 0) {
            waitingRoomCust--;
            sleep((rand() % 12));
            printf("Customer has been given a haircut.");
        }
        if(waitingRoomCust <= 3) {
            waitingRoomCust++;
            printf("The waiting room has now %i customers.", waitingRoomCust);
        }

if(waitingRoomCust)是学习使用调试器的时候了。根本没有输出?如何在父进程和子进程之间进行通信?使用
fork()
创建进程而不是线程。变量和内存在进程之间不共享。from man fork():
在Linux下,fork()是使用写页复制实现的,因此它带来的唯一损失是复制父级的页表以及为子级创建独特的任务结构所需的时间和内存。
习惯于花3分钟仔细阅读使用调用的文档对不起,我在这方面不在行,谢谢谢谢大家的帮助,我和大家都将学习使用调试器。我是用notepad++编写的,不确定它是否可用。它将不起作用,因为每个进程都有自己的变量,并且没有任何方法可以使用调试器communicate@IvanIvanovichchux的答案确实有效,因为chux使用共享内存(通过mmap)在两个进程之间进行通信。如前所述,以及chux在其答案中提供的链接。