⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bus.c

📁 设公共汽车上
💻 C
字号:
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<linux/sem.h>
#include<linux/shm.h>
#include<pthread.h>

void P(int semid,int index)
{ struct sembuf sem;
  sem.sem_num=index;
  sem.sem_op=-1;
  sem.sem_flg=0;
  semop(semid,&sem,1);
  return;
}
void V(int semid,int index)
{ struct sembuf sem;
  sem.sem_num=index;
  sem.sem_op=1;
  sem.sem_flg=0;
  semop(semid,&sem,1);
  return;
}
int semid;
driver()
{ int i=0;
  while(i<2)
  { P(semid,0);
    printf("start the bus\n");
    sleep(3);
    printf("running normally\n");
    sleep(3);
    printf("then stop the bus\n");
    sleep(3);
    V(semid,1);
    i++;
  }
}
seller()
{ int j=0;
  while(j<2)
  { printf("men get on\n");
    sleep(3);
    printf("close the door\n");
    sleep(3);
    V(semid,0);
    printf("sell the tickets\n");
    sleep(3);
    P(semid,1);
    printf("open the door\n");
    sleep(3);
    printf("men get off\n");
    sleep(3);
    j++;
  }
}

main()
{ union semun semopts;
  int res,i,status;
  pid_t d,s;
  pid_t t1,t2;
  
  semid = semget(300,2,IPC_CREAT|0666);
  if(semid<0)
  { printf("error");
    return;
  }
  semopts.val=0;
  res=semctl(semid,0,SETVAL,semopts);
  if(res<0)  return;
  semopts.val=0;
  res=semctl(semid,0,SETVAL,semopts);
  if(res<0)  return;
  d=fork();
  if(d==0)
  driver();
   { s=fork();
     if(s==0)
     seller();
     else
      { t1=waitpid(d,&status,0);
        t2=waitpid(s,&status,0);
        semctl(semid,0,IPC_RMID,0);
        semctl(semid,1,IPC_RMID,0);
      }
   }
}

输出结果:
men get on
close the door
sell the tickets
start the bus
running normally
then stop the bus
open the door
men get off
men get on
close the door
sell the tickets
start the bus
running normally
then stop the bus
open the door
men get off

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -