linux进程间通信-------共享内存

来源:互联网 发布:淘宝运营每天做什么 编辑:程序博客网 时间:2024/06/18 08:49
Linux系统中的两个进程可以通过共享内存的方式来进行通信,属于IPC通信,也就意味着和键值有关。。。

首先通过某个进程创建一片共享内存,创建的这片共享内存会返回一个描述符,这样其它的进程也可以使用这片内存。要使用共享内存的进程都必须先把那片内存映射到要调用的进程里,这里可以自己创建一个结构,用这个结构的指针来指向这片地址。

用完共享内存后,要把共享内存和进程分离,最后分离的进程还要把这块共享内存删除。

用到的函数有
shmget 创建/获取共享内存
shmat   映射共享内存
shmdt   脱离(分离)共享内存
shmctl  控制共享内存(其中可以删除共享内存)

#include
#include
#include
#include
#include
#include
#include

#define TEXT_SZ 2048

struct shared_use_st
{
    int written_by_you;
    charsome_text[TEXT_SZ];
};

int main()
{
    int shmid;
    int running = 1;
    struct shared_use_st*shared_stuff;
    char buffer[TEXT_SZ];
    
    //1.创建共享内存
    shmid = shmget((key_t)1234,sizeof(struct shared_use_st), IPC_CREAT);
    if(shmid == -1)
    {
    printf("creat shmid failed\n");
    exit(EXIT_FAILURE);
    }
    
    //2.映射共享内存
    shared_stuff = (structshared_use_st *)shmat(shmid, NULL, 0);
    
    //3.循环
    while(running == 1)
    {
    while(shared_stuff->written_by_you == 1)
     {
       sleep(1);
       printf("waitreadprocess!\n");
     }
    
     //3.1获取用户输入
    fgets(buffer, TEXT_SZ, stdin);
    
     //3.2将用户输入的字符串放入共享内存
    strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
    shared_stuff->written_by_you = 1;
    
    if(strncmp(buffer, "end", 3) == 0)
       running = 0;
    }   
    
    //4.脱离共享内存
    shmdt((const void*)shared_stuff);
    
    return 1;
}