📄 jinchengtongbu.txt
字号:
#include <stdio.h>
#include <string.h>
#include <time.h> /*time及stdlib:产生随机数*/
#include <stdlib.h>
#include <conio.h>
typedef int semaphore;
typedef char products;
typedef struct _proc
{
char name[32]; /*进程名*/
int state; /*状态 1:运行 2:就绪 3:等待 4:完成*/
char reason; /*等待原因*/
int inter; /*断点*/
}PROC;
semaphore s1=10,s2=0;
int PC;
PROC *pnow; /*一组全局变量*/
PROC proc[2];
products B[10];
char cc,xx;
/*下面是程序子函数*/
void print()
{
switch(pnow->state)
{
case 1:{printf("pnow->state: run\n");break;}
case 2:{printf("pnow->state: ready\n");break;}
case 3:{printf("pnow->state: wait\n");break;}
case 4:{printf("pnow->state: finish\n");break;}
}
}
products produce (char SRC[]) /*关于product: 与提示不同 在此我用来自动(非手动)判断生产者结束条件*/
{ /*本子函数用来:从给出的字符串中读入一个字符 很简单*/
products c;
static int count=0;
int length;
length=strlen(SRC);
if(count<length)
{ proc[0].state=2;
c=SRC[count];
count+=1;
return c;
}
else
{proc[0].state=4;return 0;} /*若越界 即生产者任务结束*/
}
void P(semaphore *S,char C) /*p操作函数*/
{
*S=*S-1;
printf("P_S%c : %d\n",C,*S);
if (*S<0) /*若S自减一后 S值小于0 则将调用p(s)的进程置为等待信号量s的状态 否则将调用p(s)的进程置为就绪*/
{
pnow->state=3;
pnow->reason=C;
printf("pnow->reason: s%c\n",C);
}
else
pnow->state=2;
print();
}
void PUT(products C) /*PUT函数 将produce产生的产品(一个字符)放到B[]缓冲里*/
{
static IN=0;
B[IN]=C;
printf("B[IN] : %c\n",B[IN]);
IN=(IN+1)%10;
}
void V(semaphore *S,char C) /*V操作 若s增一后不大于0 则找一个等待s信号量的进程置为就绪态 最后将调用v(s)的进程置为就绪*/
{
*S=*S+1;
printf("V_S%c : %d\n",C,*S);
printf("reason: s%c\n",C);
if (*S<=0)
{
if(proc[0].state==3&&proc[0].reason==C)
proc[0].state=2;
else if(proc[1].state==3&&proc[1].reason==C)
proc[1].state=2;
}
pnow->state=2;
print();
}
products GET() /*GET函数 从缓冲区中依次取出一个产品*/
{
static OUT=0;
products x;
x=B[OUT];
OUT=(OUT+1)%10;
return x;
}
void consume(products X) /*消费产品 即将得到的字符打印出来*/
{
printf("product :%c",X);
}
void init() /*初始化函数 初始化两个进程 由于进程数较少 用数组方式*/
{
strcpy(proc[0].name,"producer");
proc[0].state=2;
proc[0].inter=0;
strcpy(proc[1].name,"consumer");
proc[1].state=2;
proc[1].inter=0;
pnow=&proc[0];
PC=0;
}
void zlzx() /*指令执行函数 核心是一个switch函数 和j的计算*/
{
int i,j;
char c1;
char x;
char src[]="ILOVEYOU!";
x=src[strlen(src)-1];
i=PC;
PC=(i+1)%4;
if (strcmp(pnow->name,proc[0].name)==0)
j=i;
else j=i+4; /*以上为j的计算 若是生产者进程 j取0~3 分别对应produce P PUT V 若是消费者进程 j取4~7 分别对应P GET V consume */
switch(j)
{
case 0: { cc=produce(src); printf("case 0:produce() cc=%c\n",cc); getchar(); break;}
case 1: { printf("case 1 P(s1)\n");P(&s1,'1');getchar(); break;}
case 2: { printf("case 2 PUT()\n");printf("cc= %c\n",cc); PUT(cc); pnow->state=2;getchar(); break;}
case 3: {printf("case 3 V(s2)\n");V(&s2,'2'); getchar(); break;}
case 4: { printf("case 4 p(s2)\n");P(&s2,'2'); getchar(); break;}
case 5: {printf("case 5 GET()\n");xx=GET(); printf("xx :%c\n",xx); pnow->state=2;getchar(); break;}
case 6: { printf("case 6 V(s1)\n"); V(&s1,'1'); getchar(); break;}
case 7: {printf("case 7 consume()\n"); consume(xx); pnow->state=2; getchar(); break;}
default: {printf("error!");}
}
/*生产者运行结束? 置完成状态 手动 不过本人已在produce函数中解决了此问题 故不再在使用*/
/*if(K!='y')
{
printf("kill produce?\n y-yes n-no");
if(strcmp(c1=getchar(),'y')==0)
{K='y';proc[0].state=4;}
}
else
proc[0].state=4;*/
}
void clqdd() /*处理器调度函数*/
{
while(1) /*一个大while循环 结束条件为生产者和消费者状态均不是就绪*/
{
int rdm;
pnow->inter=PC;
randomize(); /*随机选择就绪的进程*/
rdm=random(2);
printf("\n");
printf("rdm= :%d\n",rdm);
if (proc[rdm].state==2)
{pnow=&proc[rdm];
printf("pnow->name :%s\n",pnow->name);}
else if (proc[0].state==2)
pnow=&proc[rdm];
else if (proc[1].state==2)
pnow=&proc[rdm];
else
{
printf("GAME OVER! \n \t\t\tby 01 "); /*若已经没有就绪进程 则结束本程序 署作者名:01*/
sleep(3);
return -1;
}
pnow->state=1;
PC=pnow->inter;
getchar();
zlzx(); /*调用指令执行函数*/
}
}
void paper()
{ int i;
gotoxy(1,25);
printf("press enter to see the result......\n");
getch();
clrscr();
gotoxy(1,1);
textcolor(GREEN);
textbackground(RED);
gotoxy(10,2);
putch(0xc12);
for(i=1;i<44;i++)
putch(0xcd);
putch(0xbb);
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba);
gotoxy(54,i);putch(0xba);
}
gotoxy(10,20);putch(0xc8);
for(i=1;i<44;i++)
putch(0xcd);
putch(0xbc);
window(11,6,60,21);
clrscr();
textbackground(BLACK);
window(1,1,80,25);
gotoxy(10,21);
}
void main()
{
paper();
init();
clqdd();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -