📄 reader.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 + -