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