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

📄 reader.c

📁 Unix进程通讯及同步互斥机制
💻 C
字号:
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<unistd.h>
#include<time.h>
#include<errno.h>

#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
 /* union semun is defined by including */
#else
 /* according to X/OPEN we have to define it ourselves */
	union semun 
	{
		int val;                  /* value for SETVAL */
		struct semid_ds *buf;     /* buffer for IPC_STAT, IPC_SET */
		unsigned short *array;    /* array for GETALL, SETALL */
			/* Linux specific part: */
		struct seminfo *__buf;    /* buffer for IPC_INFO */
	};
#endif

void createsem(int *semid,key_t key,int members)
{
	int cntr;
	union semun semopts;
	struct semid_ds seminfo;
	int i=0;
	printf ("Creating new semaphore set with %d members\n",members);
	if((*semid=semget(key,members,IPC_CREAT|IPC_EXCL|0666))>=0)
	{
		semopts.val=1;
		for(cntr=0;cntr<members;cntr++)
		{
			if(cntr==1){
				semopts.val=0;
				semctl(*semid,cntr,SETVAL,semopts);
				semopts.val=1;
				continue;
			}
			semctl(*semid,cntr,SETVAL,semopts);
		}
	}
	else if(errno==EEXIST)
	{
		*semid=semget(key,members,0666);
		semopts.buf=&seminfo;
		for(i=0;i<60;i++)
		{
			semctl(*semid,0,IPC_STAT,semopts);
			if(semopts.buf->sem_otime!=0)
				return;
			sleep(1);
		}
		fprintf(stderr,"Semaphore set exists,but haven't been initialized yet\n");
		exit(1);
	}
}

void P(int semid,int semnum1,int num1,int semnum2,int num2)
{
	int val1,val2;
	struct sembuf semtempp={semnum1,-1,SEM_UNDO};
	struct sembuf semtempp1={semnum2,1,SEM_UNDO};
	if(((val1=semctl(semid,semnum1,GETVAL,0)))==num1&&((val2=semctl(semid,semnum2,GETVAL,0))==num2))
	{
		printf("Resoreces exhausted!\n");
		sleep(1);
	}
	if((val1=semctl(semid,semnum1,GETVAL,0))==num2)
		semop(semid,&semtempp,1);
	semop(semid,&semtempp1,1);
}


void V(int semid,int semnum,int op)
{
	struct sembuf semtempv={semnum,op,SEM_UNDO};
	semop(semid,&semtempv,1);	
}


int Read(FILE *f,int fd)
{
	char  randInteger[3];
	char ch;
	int i,j;
	if(feof(f)!=0) 
	{
		fclose(f);
		return 0;
	}
	for(i=0;i<4;i++) 
	{
		if((ch=fgetc(f))!=',')	randInteger[i]=ch;
		else break;
	}
	printf("Process id is %d\nThe current random number is ",fd);
	
	j=0;
	while(j<i)
	{
		printf("%c",randInteger[j]);
		j++;
	}
	printf("\n");
	return 1;
}

int main()
{
	FILE *f;
	key_t key;
	int semid,sleepingtime,fd=getpid();
	key=ftok("/etc/passwd",0);
	if((f=fopen("Record","r"))==NULL)
	{
		printf("Open file faults!\n");
		exit(1);
	}
	createsem(&semid,key,2);
	printf("\nCreating semaphore successful!\n\n");	
	srand(time(0));
	while(1)
	{
		int readflag;
		P(semid,0,0,1,0);	
		printf("Reading ……\n");
		readflag=Read(f,fd);
		V(semid,1,-1);
		if(semctl(semid,1,GETVAL,0)==0) V(semid,0,1);		
		if(readflag==0)
		{
			printf("EOF!\n");
			sleep(15);
			if((f=fopen("Record","r"))==NULL)
			{
				printf("Open file faults!\n");
				exit(1);
			}
		}
		else
		{
			sleepingtime=rand()%3+1;
			printf("Sleeping...\n\n");
			sleep(sleepingtime);
		}
	}
	exit(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -