现在的位置: 首页 > 综合 > 正文

C语言信号量实现红绿灯

2013年01月23日 ⁄ 综合 ⁄ 共 2001字 ⁄ 字号 评论关闭

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/sem.h> 
#include <sys/ipc.h> 
#include <stdlib.h> 
#include <error.h> 
#include <string.h> 
 
int sem_id; 
int deng[4]={0}; 
 
void creat_sem(); 
int get_key(); 
void init_sem(); 
void request_sem(int nsem_id); 
void release_sem(int nsem_id); 
void sem_del(); 
void print(); 
 
int main() 
{ 
	atexit(sem_del); 
	creat_sem(); 
	init_sem(); 
	printf("\033[0;0H\033[2J"); 
	do 
	{ 
		release_sem(0); 
		release_sem(3); 
		request_sem(1); 
		request_sem(2); 
		print(); 
		request_sem(0); 
		request_sem(3); 
		release_sem(1); 
		release_sem(2); 
		print(); 
	}while(1); 
} 
 
void creat_sem() 
{ 
	key_t key=get_key(); 
	sem_id=semget(key,4,IPC_CREAT|0600); 
	if(sem_id==-1) 
	{ 
		perror("semget error"); 
		exit(1); 
	}	 
} 
 
int get_key() 
{ 
	int key; 
	key=ftok(".",'a'); 
	return key; 
} 
 
void init_sem() 
{ 
	int i; 
	int val=1; 
	int ret; 
	for(i=0;i<4;i++) 
	{ 
		ret=semctl(sem_id,i,SETVAL,val); 
		if(ret==-1) 
		{ 
			perror("semctl error"); 
			exit(1); 
		} 
	} 
} 
 
void request_sem(int nsem_id) 
{ 
	struct sembuf sbuf; 
	sbuf.sem_num=nsem_id; 
	sbuf.sem_op=-1; 
	sbuf.sem_flg=IPC_NOWAIT; 
	//printf("索引%d申请资源\n",nsem_id); 
	if(semop(sem_id,&sbuf,1)==-1) 
	{ 
		perror("request semop error"); 
		exit(1); 
	} 
	//printf("\033[32m%d--->绿灯\t\033[0m",nsem_id); 
	deng[nsem_id]=1; 
} 
 
void release_sem(int nsem_id) 
{ 
	struct sembuf sbuf; 
	sbuf.sem_num=nsem_id; 
	sbuf.sem_op=1; 
	sbuf.sem_flg=IPC_NOWAIT; 
	//printf("索引%d释放资源\n",nsem_id); 
	if(semop(sem_id,&sbuf,1)==-1) 
	{ 
		perror("release semop error"); 
		exit(1); 
	} 
	//printf("\033[31m%d--->红灯\t\033[0m",nsem_id); 
	deng[nsem_id]=0; 
} 
 
void sem_del() 
{ 
	if(semctl(sem_id,0,IPC_RMID,0)==-1) 
	{ 
		perror("rmid error"); 
		exit(1); 
	} 
} 
void print() 
{ 
	int i=0; 
	char sstr[4][20]={'\0'}; 
	char *str[4]={sstr[0],sstr[1],sstr[2],sstr[3]}; 
	for(i=0;i<4;i++)	 
	{ 
		if(deng[i]==1) 
		{ 
			strcpy(str[i],"\033[32m绿\033[0m"); 
		} 
		else if(deng[i]==0) 
		{ 
			strcpy(str[i],"\033[31m红\033[0m"); 
		} 
	} 
	for(i=4;i>=0;i--) 
	{ 
		printf("\033[u\033[s                       北                      \n"); 
		printf(" time:%d           |    %s    |                   \n",i,str[0]); 
		printf("                  |          |                 \n"); 
		printf("                  |          |                 \n"); 
		printf("                  |          |                 \n"); 
		printf(" -----------------            ----------------\n"); 
		printf("                                             \n"); 
		printf("西 %s                                    %s  东  \n",str[1],str[2]); 
		printf("                                             \n"); 
		printf(" -----------------            ----------------\n"); 
		printf("                  |          |                 \n"); 
		printf("                  |          |                 \n"); 
		printf("                  |          |                 \n"); 
		printf("                  |    %s    |                 \n",str[3]); 
		printf("                       南                     \n"); 
		//if(i!=0) 
		sleep(1); 
	} 
}

抱歉!评论已关闭.