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

📄 smoker.c

📁 一个吸烟者问题的例子
💻 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 + -