#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <semaphore.h>
int main()
{
key_t key = ftok("./",2);
//创建共享内存的IPC对象
int shmid = shmget(key, 2,IPC_CREAT | 0666);//共享内存的大小必须是偶数,实际上在本代码中只需要1个
//创建有名信号量并初始化
sem_t *space = sem_open("/my_spsce", O_CREAT,0666, 1);
sem_t *data = sem_open("/my_data", O_CREAT,0666, 0);
char *p = shmat(shmid, NULL, 0);//映射
char *msg = "0123456789";
int i = 0;
while(1)
{
//把空间-1,p(空间)
sem_wait(space);
memcpy(p, msg+i, 1);//0,1,2,3,4,5,6,7,8,9,memset
//把数据量+1,v(数据)
sem_post(data);
i = (i+1)%10;//(0+1)%10
}
shmdt(p);//解除映射
}
P_r
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <semaphore.h>
int main()
{
//创建key值和获取共享内存的ID
key_t key = ftok("./",2);
int shm_id = shmget(key,2, IPC_CREAT | 0666);//共享内存的大小,必须是偶数
//将这个共享内存映射至本进程的虚拟空间
char *p = shmat(shm_id, NULL,0);//p就是共享内存的首地址
//打开有名信号量
sem_t *space = sem_open("/my_spsce", O_CREAT);
sem_t *data = sem_open("/my_data", O_CREAT);
while(1)
{
//把数据-1
sem_wait(data);
fprintf(stderr,p);
//空间+1
sem_post(space);
}
shmdt(p);//解除映射
}