📄 smoker.c
字号:
/*smoking.c*/
/*assume 0 stands for tobacco,1 for paper,2 for matchs*/
/*also 0 stands for tobacoo ower,1 for paper ower,2 for matsh ower*/
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{int semid;
int nsems=5;
int flags=0666;
struct sembuf buf;
int P(int semid,int n)
{buf.sem_num=n;
buf.sem_op=-1;
buf.sem_flg=0;
return(semop(semid,&buf,1));
}
int V(int semid,int n)
{buf.sem_num=n;
buf.sem_op=+1;
buf.sem_flg=0;
return(semop(semid,&buf,1));
}
int random()
{int i;srand(time(NULL));
return i=rand()%3;}
semid=semget(IPC_PRIVATE,nsems,flags);
if(semid<0){perror("semget");exit(EXIT_FAILURE);}
printf("semphore created:%d\n",semid);
pid_t val;
printf("PID before fork():%d\n",(int)getpid());
V(semid,3);
val=fork();
if(val!=0)
{printf("parent process PID:%d\n",(int)getpid());
pid_t val1;
val1=fork();
if(val1!=0){printf("parent process PID:%d\n",(int)getpid());
pid_t val2;
val2=fork();
if(val2!=0){printf("parent process PID:%d\n",(int)getpid());
printf("\n\n");
printf("0 stands for tobacco ; 1 stands for paper ; 2 stands for matchs\n\n");
printf("\n\n");
while(1){
P(semid,3);
int i,j,m;
while(1){i=random();j=random();if(i!=j)break;}
printf("NOW YOUR HAVE THE SOURCE:%d\t%d\n",i,j);
if(i!=1&&j!=1)m=1;
if(i!=2&&j!=2)m=2;
if(i!=0&&j!=0)m=0;
V(semid,m);
printf("\n\n");
}
}
else{
printf("2child process PID:%d\n",(int)getpid());
{
while(1){
P(semid,2);
printf("now,THE MATCHS OWER is smoking!\n");
V(semid,3);}
}
}
}
else{ printf("1child process PID:%d\n",(int)getpid());
while(1){
P(semid,1);
printf("now,THE PAPER OWER is smoking!\n");
V(semid,3);}
}
}
else
{printf("0child process PID:%d\n",(int)getpid());
while(1){
P(semid,0);
printf("now,THE TOBACCO OWER is smoking!\n");
V(semid,3);}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -