标签:
/*************************************************************************
> File Name: shm1.c
> Description: shm1.c是消费者程序
> Author: Liubingbing
> Created Time: 2015年07月18日 星期六 13时07分46秒
> Other: shm1.c
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/* sys/shm.h中定义了共享内存使用的函数 */
#include <sys/shm.h>
#include "shm_com.h"
int main()
{
int running = 1;
void *shared_memory = (void*)0;
/* 定义了指向结构shared_use_st的指针shared_stuff */
struct shared_use_st *shared_stuff;
int shmid;
srand((unsigned int)getpid());
/* shmget创建共享内存段
* 第一个参数有效地为共享内存段命名
* 第二个参数以字节为单位指定需要共享的内存容量
* 第三个参数包含9个比特的权限标志
* 如果成功,则返回一个进程标识符(将用于后续的共享内存函数).如果失败,则返回-1 */
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);
if (shmid == -1) {
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
}
/* shmat函数启动对共享内存的访问,它将共享内存连接到一个进程的地址空间
* 第一个参数shmid是shmget函数返回的共享内存标识符
* 第二个参数指定的是共享内存连接到当前进程中的地址位置,通常是空指针,表示让系统来选择共享内存出现的地址
* 第三个参数一组位标志,一般取0
* 如果成功,则返回一个指向共享内存第一个字节的指针.如果失败,则返回-1 */
shared_memory = shmat(shmid, (void *)0, 0);
/* 判断shmat函数是否调用成功 */
if (shared_memory == (void *)-1) {
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}
/* shared_memory是指向共享内存第一个字节的指针 */
printf("Memory attached at %X\n", (int)shared_memory);
/* shared_stuff是指向结构shared_use_st的指针,转换后它指向共享内存 */
shared_stuff = (struct shared_use_st *)shared_memory;
/* 当数据写入结构shared_use_st时,标志writen_by_you通知消费者 */
shared_stuff->written_by_you = 0;
while (running) {
if (shared_stuff->written_by_you) {
/* 如果标志written_by_you为1,则输出some_text(这其实也意味着有新的数据读入到some_text ) */
printf("You wrote: %s", shared_stuff->some_text);
sleep(rand() % 4);
/* 输出some_text的数据之后,将written_by_you置为0 */
shared_stuff->written_by_you = 0;
if (strncmp(shared_stuff->some_text, "end", 3) == 0) {
running = 0;
}
}
}
/* shmdt函数将共享内存从当前进程中分离 */
if (shmdt(shared_memory) == -1) {
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
}
/* shmctl函数用于控制共享内存
* 第一个参数shmid是shmget函数返回的共享内存标识符
* 第二参数command是将要采取的动作,IPC_RMID表示删除共享内存段
* 第三个参数buf是一个指针,它指向包含共享内存模式和访问权限的结构 */
if (shmctl(shmid, IPC_RMID, 0) == -1) {
fprintf(stderr, "shmctrl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
shm2.c/*************************************************************************
> File Name: shm2.c
> Description: shm2.c程序是生产者程序,通过它向消费者程序shm1.c输入数据
> Author: Liubingbing
> Created Time: 2015年07月18日 星期六 13时40分15秒
> Other: shm2.c
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/* sys/shm.h文件定义了共享内存使用的函数 */
#include <sys/shm.h>
#include "shm_com.h"
int main()
{
int running = 1;
void *shared_memory = (void *)0;
/* shared_stuff是指向shared_use_st结构的指针
* shared_use_st结构在消费者和生产者程序中都会用到,当有数据写入这个结构时,written_by_you通知消费者 */
struct shared_use_st *shared_stuff;
char buffer[BUFSIZ];
int shmid;
/* shmget函数用于创建创建共享内存
* 第一个参数key有效地为共享内存段命名
* 第二个参数size_t以字节为单位指定需要共享的内存容量
* 第三个参数shmflg包含9个比特的权限标志,类似文件访问权限
* 如果成功,则返回非负整数,即共享内存标识符.如果失败,则返回-1 */
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);
/* 判断共享内存是否已经创建成功 */
if (shmid == -1) {
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
}
/* shmat函数启用对共享内存的访问,它将共享内存连接到一个进程的地址空间
* 第一个参数shmid是由shmget返回的共享内存标识符
* 第二个参数shm_addr指定的是共享内存连接到当前进程中的地址位置,通常是空指针,表示让系统来选择共享内存出现的地址
* 第三个参数shmflg是一组位标志
* 如果成功,则返回一个指向共享内存第一个字节的指针.如果失败,则返回-1 */
shared_memory = shmat(shmid, (void *)0, 0);
/* 判断启动对共享内存的访问是否成功 */
if (shared_memory == (void *)-1) {
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}
/* shared_memory是指向共享内存第一个字节的指针 */
printf("Memory attached at %X\n", (int)shared_memory);
shared_stuff = (struct shared_use_st *)shared_memory;
while (running) {
/* 判断标志written_by_you是否为1,如果为1,表示some_text中的数据还未被读取,则该进程继续sleep等待some_text被读取 */
while (shared_stuff->written_by_you == 1) {
sleep(1);
printf("waiting for client...\n");
}
printf("Enter some text: ");
/* 从标准输入stdin中的读入至多BUFSIZ个字节的数据到buffer指向的内存中 */
fgets(buffer, BUFSIZ, stdin);
/* strncpy从buffer指向的内存中拷贝至多TEXT_SZ个字节的数据到share_stuff->some_text指向的内存中 */
strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
/* 设置标志written_by_you为1 */
shared_stuff->written_by_you = 1;
/* 判断buffer的前三个字节是否为"end" */
if (strncmp(buffer, "end", 3) == 0) {
running = 0;
}
}
/* shmdt函数将共享内存从当前进程中分离
* 参数shared_memroy是shmat函数(启用共享内存的访问)返回的地址指针
* 如果成功,则返回0.如果失败,则返回-1
* 注意,将共享内存分离并未删除它,只是使得该共享内存对当前进程不再可用 */
if (shmdt(shared_memory) == -1) {
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}第一个程序是消费者,它将创建一个共享内存段,然后把写到它里面的数据都显示出来./*************************************************************************
> File Name: shm_com.h
> Description: shm_com.h定义将要分发的共享内存
> Author: Liubingbing
> Created Time: 2015年07月18日 星期六 13时02分43秒
> Other: shm_com.h被消费者(shm1.c)和生产者(shm2.c)程序都会用到.当有数据写入到这个结构时,用该结构中的written_by_you通知消费者.
************************************************************************/
#ifndef _SHM_COM_H
#define _SHM_COM_H
#define TEXT_SZ 2048
struct shared_use_st {
int written_by_you;
char some_text[TEXT_SZ];
};
#endif
这里定义的结构在消费者和生产者程序中都会用到.当有数据写入这个结构时,则用该结构中的一个整型标志written_by_you来通知消费者.需要传输的文件长度2K是随意的.版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yiranant/article/details/46947881