18,771
社区成员
发帖
与我相关
我的任务
分享
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <string.h>
#define SHMKEY 9075 /*共享存储区的键*/
#define SEMKEY_FATHER 9085
#define SEMKEY_MOTHER 9086
#define SEMKEY_DAUTHER 9087
#define SEMKEY_SON 9088
#define SEMKEY_MUTEX 9089
#define SEMKEY_NUM 9090/*信号量数组的键*//*注意:上面的键在系统中必须唯一*/
#define BUFF_LEN 5 /*缓冲区可以存放5个产品*/
#define FRUIT_LEN 1/*每个产品是一个字符串:<=32字符*/
/*下面的P,V是对系统调用的简单封装*/
int P(int semid)
{
struct sembuf p_buf;
p_buf.sem_num = 0;
p_buf.sem_op = -1;
p_buf.sem_flg = 0;
if(semop(semid, &p_buf, 1)==-1)/*semop参见课件ppt*/
{
perror ("p (semid) falsed");
exit (1);
}
else
return (0);
}
int V(int semid)
{
struct sembuf v_buf;/*struct sembuf 参见课件ppt*/
v_buf.sem_num = 0;
v_buf.sem_op = 1;
v_buf.sem_flg = 0;
if(semop(semid, &v_buf, 1)==-1)
{
perror (" v (semid) failed");
exit (1);
}
else
return (0);
}
main()
{
char *p_buffer;/*共享存储区地址*/
unsigned char in;/*生产者存放产品的指针:它的值存放在全局缓冲区第一个字节*/
//char fruit[128];/*事实只使用32B,128为了避免屏幕输入超过32*/
char fruit;
int shmid;/*共享存储区id*/
int semid_dauther,semid_son, semid_mutex,semid_num;/*信号量集合id*/
shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN+2, 0777);/*连接共享存储区:2 存放in,out的值*/
p_buffer = (char*)shmat(shmid, 0, 0);/*取共享存储区地址*/
semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*获取全局信号量id*/
//semid_father = semget(SEMKEY_FATHER,1, 0777);
// semid_mother = semget(SEMKEY_MOTHER,1, 0777);
semid_dauther = semget(SEMKEY_DAUTHER,1, 0777);
semid_son = semget(SEMKEY_SON,1, 0777);
semid_num = semget(SEMKEY_NUM,1, 0777);
int flag=0;
printf("Please FRUIT(a string ,length <= 32B):(input 'a')====:\n");
//getchar(fruit);/*128的意义在此,此函数不检查字符串长度*/
scanf("%c",&fruit);
//strcpy(fruit,strcat('a',fruit));
/*从屏幕接收产品*/
while(flag==0){
if (fruit=='a'||fruit=='A')
flag=1;
else{
printf("Not an apple!");
flag=0;
printf("Please FRUIT(a string ,length <= 32B):(input 'a')====:\n");
scanf("%c",&fruit);
//getchar(fruit);/*128的意义在此,此函数不检查字符串长度*/
}
}
/*进入临界区*/
// P(semid_father);/*对私有信号量作P操作*/
P(semid_mutex);/*对公有信号量作P操作*//*二者顺序不能换*/
P(semid_num);
in = (unsigned char)(*p_buffer);
strncpy(p_buffer + 2 + in * FRUIT_LEN, fruit,FRUIT_LEN);
in = (in + 1) % BUFF_LEN;
*p_buffer = (char)in;
shmdt(p_buffer); /*离开缓冲区*/
/*离开临界区*/
V(semid_dauther);
V(semid_mutex);
}