📄 readerwriter.c
字号:
/* reader&writter problem */
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int main(void)
{
int semid;
int nsems=3;
int flags=0666;
struct sembuf buf;
int count=0;
semid=semget(IPC_PRIVATE,nsems,flags);
if(semid<0)
{
perror("semget");
exit(1);
}
printf("semaphore created :%d\n",semid);
semctl(semid,0,SETVAL,1);
semctl(semid,1,SETVAL,1);
semctl(semid,2,SETVAL,1);
pid_t val;
val=fork();
if(val==0)
{
/*printf("child process PID:%d\n",(int)getpid());*/
while(1)
{
/* process writter */
buf.sem_num=2;
buf.sem_op=-1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
buf.sem_num=1;
buf.sem_op=-1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
printf("writer is writing now\n");
sleep(2);
buf.sem_num=1;
buf.sem_op=1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
buf.sem_num=2;
buf.sem_op=1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
}
}
else
{
/*printf("parent process PID:%d\n",(int)getpid());*/
while(1)
{
/* process reader */
printf("reader %d is trying to read\n",count+1);
buf.sem_num=2;
buf.sem_op=-1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
buf.sem_num=0;
buf.sem_op=-1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
if(count==0)
{
buf.sem_num=1;
buf.sem_op=-1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
}
count++;
buf.sem_num=0;
buf.sem_op=1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
buf.sem_num=2;
buf.sem_op=1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
printf("reader %d is reading now\n",count);
sleep(2);
buf.sem_num=0;
buf.sem_op=-1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
count--;
if(count==0)
{
buf.sem_num=1;
buf.sem_op=1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
}
buf.sem_num=0;
buf.sem_op=1;
buf.sem_flg=0;
if((semop(semid,&buf,1))<0)
{
perror("semop");
exit(EXIT_FAILURE);
}
}
}
/* delete the semaphore */
if((semctl(semid,0, IPC_RMID))<0)
{
perror("semctl IPC_RMID");
exit(1);
}
else
{
printf("semaphore removed\n");
}
exit(EXIT_SUCCESS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -