标签:
/************************************************************************* > 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