/**IPC机制之共享内存----写端
* 写端写入数据,由于对端读取共享内存后不阻塞,故应用状态机制
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <string.h>
//辅助结构体
struct message
{
int flag;
char buf[256];
};
int main(void) {
int shmid;
char* addr = NULL;
struct message* msg;
msg->flag = 0;//标识数据是否有被读取过
//1. 获取共享内存
shmid = shmget(1234, 1024, IPC_CREAT);//获取key为1234,大小为1024的共享内存,不存在则创建
if (shmid < 0) {
perror("shmget error.");
exit(1);
}
//2. 关联共享内存
addr = shmat(shmid, NULL, 0);
if (addr == (void*)-1) {
perror("shmat error.");
exit(1);
}
msg = (struct message*)addr;
printf("关联后,addr=%p\n", addr);
//3. 使用共享内存
//通过关联后的虚拟地址使用共享内存
while (1){
fgets (msg->buf,sizeof(msg->buf),stdin);
msg->flag = 1;
if (strcmp(msg->buf,"quit\n")==0){
return 0;
}
}
//4.分离虚拟地址和共享内存
shmdt(addr);
return 0;
}
-------------------------------------------------------------------------------
/**IPC机制之共享内存----读端
* 读端读入数据,由于对端读取共享内存后不阻塞,故应用状态机制
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>
//辅助结构体
struct message
{
int flag;//标志位,用来标示共享内存是否已被读过
char buf[256];
};
int main() {
int shmid;
struct message* msg;
char *addr = NULL;
//1. 获取共享内存
//获取key为1234,大小为1024的共享内存,如果这块共享内存不存在,就创建
shmid = shmget(1234, 1024, IPC_CREAT);
if (shmid < 0) {
perror("shmget error.");
exit(1);
}
//2. 关联共享内存,将虚拟地址号和共享内存绑定,此时访问该地址即访问共享内存
addr = shmat(shmid, NULL, 0);
if (addr < 0) {
perror("shmat error.");
exit(1);
};
msg = (struct message*)addr;//将结构体指针指向共享内存
msg->flag = 0;
//3. 使用共享内存
while(1){
if (msg->flag == 1){
printf("%s\n", msg->buf);
msg->flag = 0;
if (strcmp(msg->buf,"quit\n")==0){
return 0;
}
}
}
//4. 当不需要再使用时
//把关联后的虚拟地址和共享内存分离
shmdt(addr);
return 0;
}
* 写端写入数据,由于对端读取共享内存后不阻塞,故应用状态机制
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <string.h>
//辅助结构体
struct message
{
int flag;
char buf[256];
};
int main(void) {
int shmid;
char* addr = NULL;
struct message* msg;
msg->flag = 0;//标识数据是否有被读取过
//1. 获取共享内存
shmid = shmget(1234, 1024, IPC_CREAT);//获取key为1234,大小为1024的共享内存,不存在则创建
if (shmid < 0) {
perror("shmget error.");
exit(1);
}
//2. 关联共享内存
addr = shmat(shmid, NULL, 0);
if (addr == (void*)-1) {
perror("shmat error.");
exit(1);
}
msg = (struct message*)addr;
printf("关联后,addr=%p\n", addr);
//3. 使用共享内存
//通过关联后的虚拟地址使用共享内存
while (1){
fgets (msg->buf,sizeof(msg->buf),stdin);
msg->flag = 1;
if (strcmp(msg->buf,"quit\n")==0){
return 0;
}
}
//4.分离虚拟地址和共享内存
shmdt(addr);
return 0;
}
-------------------------------------------------------------------------------
/**IPC机制之共享内存----读端
* 读端读入数据,由于对端读取共享内存后不阻塞,故应用状态机制
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>
//辅助结构体
struct message
{
int flag;//标志位,用来标示共享内存是否已被读过
char buf[256];
};
int main() {
int shmid;
struct message* msg;
char *addr = NULL;
//1. 获取共享内存
//获取key为1234,大小为1024的共享内存,如果这块共享内存不存在,就创建
shmid = shmget(1234, 1024, IPC_CREAT);
if (shmid < 0) {
perror("shmget error.");
exit(1);
}
//2. 关联共享内存,将虚拟地址号和共享内存绑定,此时访问该地址即访问共享内存
addr = shmat(shmid, NULL, 0);
if (addr < 0) {
perror("shmat error.");
exit(1);
};
msg = (struct message*)addr;//将结构体指针指向共享内存
msg->flag = 0;
//3. 使用共享内存
while(1){
if (msg->flag == 1){
printf("%s\n", msg->buf);
msg->flag = 0;
if (strcmp(msg->buf,"quit\n")==0){
return 0;
}
}
}
//4. 当不需要再使用时
//把关联后的虚拟地址和共享内存分离
shmdt(addr);
return 0;
}