Linux进程通信——共享内存

生产者进程:

/*
 * 进程间通信之信号量,代码源自《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();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值