介绍完共享函数后,我们可以编写一些代码来使用它们。我们将编写一对程序shm1.c和shm2.c。第一个程序(消费者)将创建一个共享内存段,然后把写到它里面的数据都显示出来。第二个程序(生产者)将连接一个已有的共享内存段,并允许我们向其中输入数据。
(1) 我们首先创建一个公共的头文件以定义我们希望分发的共享内存。命名shm_com.h
#define TEXT_SZ 2048
struct shared_use_st
{
int written_by_you;
char some_text[TEXT_SZ];
};
当有数据写入这个结构时,我们用该结构中的一个整型标志 written_by_you来通知消费者。需要传输的文本长度2K是由我们自己随意决定的。
(2)消费者程序
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "shm_com.h"
int main()
{
int running = 1;
void *shared_memory = (void *)0;
struct shared_use_st *shared_stuff;
int shmid;
srand((unsigned int)getpid());
//
shmid = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid == -1)
{
fprintf(stderr,"shmget failed\n");
exit(EXIT_FAILURE);
}
//让程序访问这个共享内存
shared_memory = shmat(shmid,(void *)0,0);
if(shared_memory == (void *)-1)
{
fprintf(stderr,"shmat failed\n");
exit(EXIT_FAILURE);
}
printf("Memory attached at %X\n",(int)shared_memory);
shared_stuff = (struct shared_use_st *)shared_memory;
shared_stuff->written_by_you = 0;
while(running)
{
if(shared_stuff->written_by_you)
{
printf("You wrote:%s",shared_stuff->some_text);
sleep( rand() % 4 );
shared_stuff->written_by_you = 0;
if(strncmp(shared_stuff->some_text,"end",3) == 0)
{
running = 0;
}
}
}
//最后,共享内存被分离,然后被删除
if(shmdt(shared_memory) == -1)
{
fprintf(stderr,"shmdt failed\n");
exit(EXIT_FAILURE);
}
if(shmctl(shmid,IPC_RMID,0) == -1)
{
fprintf(stderr,"shmctl (IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
(3)生产者程序--待续