#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#define DATA_LENGTH 128
struct mydata
{
int size;
char data[DATA_LENGTH];
};
void producer()
{
printf("producer.\n");
int ret;
unsigned short sem_array[2];
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
}arg;
key_t key_sem = ftok(".", 'b');
if (-1 == key_sem)
{
perror("key");
}
int sem_id = semget(key_sem, 2, IPC_CREAT | 0660);
if (-1 == sem_id)
{
perror("semget");
}
sem_array[0] = 0; // 初始数据个数为0
sem_array[1] = 1; // 初始空间个数为1
arg.array = sem_array;
ret = semctl(sem_id, 0, SETALL, arg); //设置信号量
if(ret == -1)
{
perror("semctl");
}
key_t key_shm = ftok(".", 'd');
int shm_id=shmget(key_shm, 512, IPC_CREAT | 0666);
if (-1 == shm_id)
{
perror("shmget");
}
printf("shmid is:%d\n", shm_id);
struct mydata * p_mydata;
p_mydata = (struct mydata *) shmat(shm_id, NULL, 0);
struct sembuf sops[2];
sops[0].sem_num = 0; // 数据
sops[0].sem_op = 1;
sops[0].sem_flg = 0;
sops[1].sem_num = 1; // 空间
sops[1].sem_op = -1;
sops[1].sem_flg = 0;
char * data = "data produced.";
int i = 0;
for (i=0; i<10; i++)
{
semop(sem_id, (struct sembuf *)&sops[1], 1);
printf("produceing\n");
p_mydata->size = strlen(data);
strcpy(p_mydata->data, data);
semop(sem_id, (struct sembuf *)&sops[0], 1);
sleep(1);
}
if(shmdt(p_mydata) == -1)
{
perror("detach error");
}
semctl(sem_id, IPC_RMID , 0);
}
void consumer()
{
printf("consumer.\n");
key_t key_sem = ftok(".", 'b'); // 获取键值
int sem_id = semget(key_sem, 2, IPC_CREAT|0666); // 得到信号量标示符
if (-1 == sem_id)
{
perror("semget");
}
struct sembuf sops[2];
sops[0].sem_num = 0; // 数据
sops[0].sem_op = -1;
sops[0].sem_flg = 0;
sops[1].sem_num = 1; // 空间
sops[1].sem_op = 1;
sops[1].sem_flg = 0;
key_t key_shm = ftok(".", 'd');
int shm_id=shmget(key_shm, 512, IPC_CREAT | 0666);
if (-1 == shm_id)
{
perror("shmget");
}
struct mydata * p_mydata;
p_mydata = (struct mydata *) shmat(shm_id, NULL, 0);
int i = 0;
for (i=0; i<10; i++)
{
semop(sem_id, (struct sembuf *)&sops[0], 1);
printf("customering\n");
printf("data size is %d, data is %s \n", p_mydata->size, p_mydata->data);
semop(sem_id, (struct sembuf *)&sops[1], 1);
sleep(1);
}
}
int main(int argc, char * argv[])
{
pid_t pid;
pid = fork();
if (-1 == pid)
{
perror("fork error:");
}
if (0 == pid)
{
producer();
}
else
{
consumer();
}
return 0;
}
Linux进程间通信之生产者消费者
5星 · 超过95%的资源 需积分: 31 195 浏览量
2013-01-20
20:43:53
上传
评论 3
收藏 3KB GZ 举报
星星浩然
- 粉丝: 13
- 资源: 2
最新资源
- 基于快速傅里叶变换算法的蜂鸣器音频分析技术
- 高分项目,PID-电机类-开源工业伺服电机PID控制,源码+原理图+操作手册
- 高分项目,PID-电机类-超级牛的STM32 BLDC直流电机控制器设计,附原理图和源码
- 高分项目,PID-电机类- 基于红外遥控的多功能智能电风扇控制器源码
- 高分项目,PID-电机类- 基于NRF24L01的PID电机转速控制器,源码+无线PID电机转速控制器+接收机
- 基于Matlab读取sif格式文件,并且画图
- Python基于Django图书管理系统(源码+数据库脚本+截图)高分期末大作业
- Screenshot_20240619_075859.jpg
- 210501230212
- JavaWeb停车收费管理系统的设计与实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈