?? jinchengtongbu.txt
字號:
#include <stdio.h>
#include <string.h>
#include <time.h> /*time及stdlib:產(chǎn)生隨機數(shù)*/
#include <stdlib.h>
#include <conio.h>
typedef int semaphore;
typedef char products;
typedef struct _proc
{
char name[32]; /*進程名*/
int state; /*狀態(tài) 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;
/*下面是程序子函數(shù)*/
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[]) /*關(guān)于product: 與提示不同 在此我用來自動(非手動)判斷生產(chǎn)者結(jié)束條件*/
{ /*本子函數(shù)用來:從給出的字符串中讀入一個字符 很簡單*/
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;} /*若越界 即生產(chǎn)者任務(wù)結(jié)束*/
}
void P(semaphore *S,char C) /*p操作函數(shù)*/
{
*S=*S-1;
printf("P_S%c : %d\n",C,*S);
if (*S<0) /*若S自減一后 S值小于0 則將調(diào)用p(s)的進程置為等待信號量s的狀態(tài) 否則將調(diào)用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函數(shù) 將produce產(chǎn)生的產(chǎn)品(一個字符)放到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信號量的進程置為就緒態(tài) 最后將調(diào)用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函數(shù) 從緩沖區(qū)中依次取出一個產(chǎn)品*/
{
static OUT=0;
products x;
x=B[OUT];
OUT=(OUT+1)%10;
return x;
}
void consume(products X) /*消費產(chǎn)品 即將得到的字符打印出來*/
{
printf("product :%c",X);
}
void init() /*初始化函數(shù) 初始化兩個進程 由于進程數(shù)較少 用數(shù)組方式*/
{
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() /*指令執(zhí)行函數(shù) 核心是一個switch函數(shù) 和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的計算 若是生產(chǎn)者進程 j取0~3 分別對應(yīng)produce P PUT V 若是消費者進程 j取4~7 分別對應(yīng)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!");}
}
/*生產(chǎn)者運行結(jié)束? 置完成狀態(tài) 手動 不過本人已在produce函數(shù)中解決了此問題 故不再在使用*/
/*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() /*處理器調(diào)度函數(shù)*/
{
while(1) /*一個大while循環(huán) 結(jié)束條件為生產(chǎn)者和消費者狀態(tài)均不是就緒*/
{
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 "); /*若已經(jīng)沒有就緒進程 則結(jié)束本程序 署作者名:01*/
sleep(3);
return -1;
}
pnow->state=1;
PC=pnow->inter;
getchar();
zlzx(); /*調(diào)用指令執(zhí)行函數(shù)*/
}
}
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();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -