linux进程间通信之共享内存

发布时间:2010-10-10 13:50:26   来源:文档文库   
字号:

本文介绍两个进程间通信的方法之一,共享内存(linux)。

共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中,其他进程可以

将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是

malloc分配的一样。如果一个进程向共享内存写入数据,所做的更改立刻被可以访问同一段共享内存的任何

其进程看到。

共享内存本身不存在同步机制。对共享内存访问的同步机制须有程序员控制。

共享内存中主要函数:shmget ,负责创建共享内存。

int shmget(key_t key, size_t size, int shmflg);



shmat 函数

连接共享内存到进程自己的地址空间。

void *shmat(int shm_id, const void* shm_addr, int shm_flag );

shmdt 函数

与上面的函数相反,作用是把共享内存从当前进程中分离。注意分离并不是删除。

shmctl函数

共享内存控制函数。

int shmctl(int shm_id, //返回的共享内存标识符

int command,//要采取的动作,有三个动作(IPC_STAT,IPC_SET,IPC_RMID

struct shmid_ds *buf //buf为指针,指向包含共享内存模式和访问权限的结构。

);



shmid_ds结构成员有至少以下内容

struct shmid_ds

{

uid_t shm_perm.uid;

uid_t shm_perm.gid;

mode_t shm_perm.mode;

};

以下为一个实例,两个进程通过共享内存读写信息。参考 Neil Richardbeginning linux

programming

#共用头文件shm_com.h

#define TEXT_SIZE 2048

struct shared_use_st

{

int written_by_you;

char some_text[TEXT_SIZE];

};

#消费者进程

share_mem1.c

#include

#include

#include

#include

#include

#include

#include

#include "shm_com.h"

int main(void)

{

int running = 1;

void * shared_memory = (void*)0;

struct shared_use_st * shared_stuff;

int shmid;

srand ((unsigned int)getpid());

shmid = shmget((key_t)1234,sizeof(struct shared_use_st), 0666 | IPC_CREAT);

if(shmid == -1)

{

fprintf(stderr,"shmget failed\n");

exit(EXIT_FAILURE);

}

shared_memory = shmat(shmid, (void*)0, 0);

if(shared_memory == (void*)0 - 1)

{

fprintf(stderr, "shmat failed\n");

exit(EXIT_FAILURE);

}

shared_stuff = (struct shared_use_st *)shared_memory;

shared_stuff -> written_by_you = 0;

while(running)

{

if(shared_stuff -> written_by_you)

{

printf("YOU worte:%s",shared_stuff -> some_text);

sleep(rand() % 4);

shared_stuff -> written_by_you = 0;

if(strncmp(shared_stuff -> some_text, "end", 3) == 0)

{

running = 0;

}

}

}

if(shmdt(shared_memory) == -1)

{

fprintf(stderr, "shmdt faild\n");

exit(EXIT_FAILURE);

}

exit(EXIT_SUCCESS);

}

#成产者进程

share_mem2.c

#include

#include

#include

#include

#include

#include

#include

#include "shm_com.h"

int main()

{

int running = 1;

void * shared_memory = (void*)0;

struct shared_use_st * shared_stuff;

char buffer[BUFSIZ];

int shmid;

shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);

if(shmid == -1)

{

fprintf(stderr, "shmget faild\n");

exit(EXIT_FAILURE);

}

shared_memory = shmat(shmid, (void*)0, 0);

if(shared_memory == (void*) - 1)

{

fprintf(stderr, "shmat faild\n");

exit(EXIT_FAILURE);

}

printf("Memory attach at %X\n", (int)shared_memory);

shared_stuff = (struct shared_use_st *)shared_memory;

while(running)

{

while(shared_stuff -> written_by_you == 1)

{

sleep(1);

printf("waitting for client .... \n");

}

printf("Enter some text");

fgets(buffer,BUFSIZ, stdin);

strncpy(shared_stuff -> some_text, buffer, TEXT_SZ);

shared_stuff -> written_by_you = 1;

if(strncmp(buffer, "end", 3) == 0)

{

running = 0;

}

}

if(shmat(shared_memory) == -1)

{

fprintf(stderr, "shmdt faild\n");

exit(EXIT_FAILURE);

}

exit(EXIT_SUCCESS);

}

本文来源:https://www.2haoxitong.net/k/doc/91956a81e53a580216fcfe8c.html

《linux进程间通信之共享内存.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式