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

📄 readerwriter.c

📁 读者和写者的问题例子
💻 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 + -