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

📄 writer.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;
		i=0;
		while(i<60)
		{
			semctl(*semid,0,IPC_STAT,semopts);
			if(semopts.buf->sem_otime!=0)
				return;
			sleep(1);
			i++;
		}
		fprintf(stderr,"Semaphore set exists,but haven't been initialized yet\n");
		exit(1);
	}
}


void P(int semid,int semnum,int num)
{
	int val;
	struct sembuf semtempp={0,-1,SEM_UNDO};
	if((val=semctl(semid,semnum,GETVAL,0))==num)
	{
		printf("Resoreces is exhausted!\n");
		sleep(1);
	}
	semtempp.sem_num=semnum;
	semop(semid,&semtempp,1);
}


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


void Write(int randtemp)
{
	FILE *f;
	if((f=fopen("Record","a+"))==NULL)
	{
		printf("Open file error!\n");
		exit(0);
	};
	fprintf(f,"%d,",randtemp);
	fclose(f);
}


int main()
{
	key_t key;
	int semid;
	int randtemp,fd=getpid(),sleeptime;
	key=ftok("/etc/passwd",0);
	createsem(&semid,key,2);
	printf("\nCreating semaphore success!\n\n");
	srand(time(0));
	while(1)
	{
		randtemp=rand()%101;
		printf("My pid is %d\nCurrent random integer is %d\n",fd,randtemp);
		sleeptime=rand()%10+1;
		P(semid,0,0);
		printf("writing random number\n");
		Write(randtemp);
		printf("success!\n");
		V(semid,0);
		printf("Sleeping\n\n");
		sleep(sleeptime);
	}
	exit(0);
}

⌨️ 快捷键说明

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