Linux共享内存通信示例
共享内存类似动态分配函数,系统一块单独的区域拿来单独分配给共享内存,不同进程都可以访问那片区域
头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
原函数
创建共享内存
int shmget(key_t key, size_t size, int shmflg);
返回 成功返回内存id,错误 -1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
挂接操作
void *shmat(int shm_id, const void *shm_addr, int shmflg);
分离操作
int shmdt(const void *shmaddr);
程序示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
typedef struct shared_use_st
{
int written;//作为一个标志,非0:表示可读,0表示可写
char text[2048];//记录写入和读取的文本
int len;
}Shm_def;
void shm_write(char *s,int len)
{
void *shm = NULL;
Shm_def *shared = NULL;
int shmid;
//创建共享内存
shmid = shmget((key_t)1234, sizeof(Shm_def), 0666|IPC_CREAT);
if(shmid == -1)
{
printf("shmget failed\n");
exit(EXIT_FAILURE);
}
//将共享内存连接到当前进程的地址空间
shm = shmat(shmid, (void*)0, 0);
if(shm == (void*)-1)
{
printf("shmat failed\n");
exit(EXIT_FAILURE);
}
printf("write at %X\n", (int)shm); //设置共享内存
shared = (Shm_def *)shm;
//数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本
while(shared->written == 1)
{
sleep(1);
printf("Waiting...\n");
}
strncpy(shared->text, s, len); //写完数据,设置written使共享内存段可读
shared->len = len;
shared->written = 1;
//把共享内存从当前进程中分离
if(shmdt(shm) == -1)
{
printf("shmdt failed\n");
exit(EXIT_FAILURE);
}
}
int shm_read(char *s,int len)
{
int rtn_len;
void *shm = NULL;//分配的共享内存的原始首地址
Shm_def *shared;//指向shm
int shmid;//共享内存标识符
//创建共享内存
shmid = shmget((key_t)1234, sizeof(Shm_def), 0666|IPC_CREAT);
if(shmid == -1)
{
printf("shmget failed\n");
exit(EXIT_FAILURE);
}
//将共享内存连接到当前进程的地址空间
shm = shmat(shmid, 0, 0);
if(shm == (void*)-1)
{
printf("shmat failed\n");
exit(EXIT_FAILURE);
}
printf("\nread at %X\n", (int)shm); //设置共享内存
shared = (Shm_def *)shm;
while(shared->written == 0)
{
sleep(1);
printf("Waiting...\n");
}
strncpy(s, shared->text, shared->len);
rtn_len = shared->len;
shared->written = 0;
printf("read:%s\n",shared->text);
//把共享内存从当前进程中分离
if(shmdt(shm) == -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);
}
return rtn_len;
}
//进程1
void process1(void)
{
while(1)
{
printf("\n\n\n\nprocess1:write shm\n");
shm_write("hello guoguo\nshm test\n",22);
sleep(2);
}
}
//进程2
void process2(void)
{
char buf[100];
int len;
while(1)
{
printf("process2:read shm\n");
len = shm_read(buf, 100);
buf[len] = '/0';
printf("%s",buf);
}
}
int main(int argc, const char *argv[])
{
pid_t pid,pid1;
//创建2个进程
pid = fork();
if(pid == 0)
{
printf("process1 create ok\n");
process1();
}
else if(pid < 0)
{
printf("process create failed\n");
perror("fork");
}
else
{
}
pid1 = fork();
if(pid1 == 0)
{
printf("process2 create ok\n");
process2();
}
else if(pid < 0)
{
printf("process2 create failed\n");
perror("fork");
}
else
{
}
return 0;
}