本文介绍两个进程间通信的方法之一,共享内存(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 和Richard的beginning 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
文档为doc格式