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

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

2017-06-21 22:50 204 查看
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;

    char
some_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 = (struct
shared_use_st *)shmat(shmid, NULL, 0);

    

    //3.循环

    while(running == 1)

    {

    
while(shared_stuff->written_by_you == 1)

     {

    
   sleep(1);

    
   printf("wait
readprocess!\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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: