📄 writer.c
字号:
/*写者:writer.c*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <string.h>
#define SHMKEY1 9075 /*共享存储区的键*/
#define SHMKEY2 9076/*公共变量readcount的存储区的键*/
#define SEMKEY_WRT 9085 /*实现写者之间的互斥和作为第一个读者读的执行条件信号量的键*/
#define SEMKEY_MUTEX 9087 /*对readcount实现互斥修改的互斥信号量的键*/
#define BUFF_LEN 1 /*缓冲区的大小为1*/
#define PRODUCT_LEN 32 /*每个产品是一个字符串:<=32字符*/
/*下面的P,V是对系统调用的简单封装*/
/*下面的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;/*共享存储区1地址*/
char product[128];/*事实只使用32B,128为了避免屏幕输入超过32*/
int shmid1;/*共享存储区id*/
int semid_wrt;/*实现写者之间的互斥和作为第一个读者读的执行条件信号量的id*/
shmid1 = shmget(SHMKEY1, BUFF_LEN * PRODUCT_LEN, 0777);/*连接共享存储区1*/
p_buffer = (char*)shmat(shmid1, 0, 0);/*取共享存储区1地址*/
semid_wrt= semget(SEMKEY_WRT,1, 0777);
p(semid_wrt);/*对私有信号量作P操作*/
/*从屏幕接收数据*/
printf("请写入数据!\n");
gets(product);/*128的意义在此,此函数不检查字符串长度*/
/*进入临界区*/
strcpy(p_buffer,product);
shmdt(p_buffer); /*离开缓冲区*/
/*离开临界区*/
v(semid_wrt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -