您的位置:首页 > 运维架构 > Linux

Linux进程通信——共享内存

2016-07-14 21:40 337 查看
生产者进程:

/*
* 进程间通信之信号量,代码源自《Linux程序设计》
*/
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// 使用信号量必须包含该文件
#include <sys/shm.h>

using namespace std;

// shmid_ds这个结构体已经在系统中定义了,所以不需要再次定义
struct shmid_ds;

#define TEXT_SZ (2028)
#define BUF_SIZE (1024)

// 用户自定义的一个数据结构,同于进行共享
struct shared_use_st
{
int written;    // 数据是否已经被写入的标志(等于1表示数据已经被写入,等于0表示没有被写)
char text[TEXT_SZ];
};

// 生产者进程
int producer()
{
int running = 1;
// 共享内存的地址
    void* shm = 0;
struct shared_use_st* shared;
// 输入缓冲区
 char buffer[BUF_SIZE + 1] = {0};

// 共享内存对象的id
int shm_id;

// 创建或者打开共享内存
shm_id = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);

if(shm_id == -1)
{
return -1;
}

// 把共享内存连接到当前进程的地址空间中
shm = shmat(shm_id,0,0);

if((void*)-1 == shm)
{
return -1;
}

// 使用共享内存,即把共享内存当成一块用户自定义的数据,可以直接进行读写
shared = (struct shared_use_st*)shm;

while (running)
{
// 消费者还没有读取完数据,需要等待
while (shared->written == 1) {
sleep(1);
}

// 用户输入一些数据
cout << "Please input something:";
fgets(buffer,BUF_SIZE,stdin);

// 写到共享内存中
strcpy(shared->text,buffer);
shared->written = 1;
// 如果用户写入的是end,那么表示退出
if(strcmp(buffer,"end") == 0)
{
running = 0;
}
}

// 把共享内存从进程的地址空间中分离
if(shmdt(shm) == -1)
{
return -1;
}
sleep(2);

return 0;
}

int main(int argc,char* argv[])
{
return producer();
}


消费者进程:

/*
* 进程间通信之信号量,代码源自《Linux程序设计》
*/
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// 使用信号量必须包含该文件
#include <sys/shm.h>

using namespace std;

// shmid_ds这个结构体已经在系统中定义了,所以不需要再次定义
struct shmid_ds;

#define TEXT_SZ (2028)
#define BUF_SIZE (1024)

// 用户自定义的一个数据结构,同于进行共享
struct shared_use_st
{
int written;    // 数据是否已经被写入的标志(等于1表示数据已经被写入,等于0表示没有被写)
char text[TEXT_SZ];
};

// 消费者进程
int consumer()
{
// 循环标志
int running = 1;
// 共享内存的地址
void* shm = NULL;
// 用户的数据结构的指针
struct shared_use_st* shared;

// 共享内存的id
int shm_id;

// 创建或者打开共享内存,创建的共享内存的大小是 sizeof(struct shared_use_st)
shm_id = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);

if(-1 == shm_id)
{
return -1;
}

// 把共享内存连接到当前进程地址空间上
shm = shmat(shm_id,0,0);
if((void*)-1 == shm)
{
return -1;
}

// 使用共享内存,把共享内存当作一块用户数据
shared = (struct shared_use_st*)shm;

shared->written = 0;

while (running)
{
// 如果数据已经被写入了,那么可以进行读取
if(shared->written > 0)
{
cout << shared->text << endl;
sleep(1);
// 重置写入标志
shared->written = 0;
// 当被写入end的时候表示退出
if(0 == strcmp(shared->text,"end"))
{
running = 0;
}
}
else
{
sleep(1);
}
}

// 把共享内存从当前进程的地址空间中分离
if(shmdt(shm) ==1)
{
return -1;
}

// 删除共享内存
if(shmctl(shm_id,IPC_RMID,0) == -1)
{
return -1;
}

return 0;
}

int main(int argc,char* argv[])
{
return consumer();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: