首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

linux能否在动态链接库中维护一块内存,而该内存可被多个进程调用。解决方法

2012-03-15 
linux能否在动态链接库中维护一块内存,而该内存可被多个进程调用。多个进程需要共享一块内存,用动态链接库

linux能否在动态链接库中维护一块内存,而该内存可被多个进程调用。
多个进程需要共享一块内存,用动态链接库是否能够实现这样的需求?
谢谢

[解决办法]
直接 共享存储
unix环境高级编程 346页
[解决办法]
Linux提供了丰富的内部进程通信机制,包括共享内存、内存映射文件、先入先出(FIFO)、接口(sockets)以及多种用于同步的标识。
一般来说,内部进程通信(interprocess communication)也就是IPC,是指两个或两个以上进程以及两个或者两个以上线程之间进行通信联系。每个IPC机制都有不同的强项或者弱点,不过没有一个IPC机制包含内建的同步方法。因此程序员不但需要自己在程序中实现同步,而且还需要为了利用IPC机制而自己开发通信协议。

共享内存
-----------------------
使用共享内存和使用malloc()来分配内存区域很相似。使用共享内存的方法是:
1 对一个进程/线程使用shmget()分配内存区域。
2 使用shmat()放置一个或多个进程/线程在共享内存中,也可以用shmctl()来获取信息或者控制共享区域。
3 使用shmdt()从共享区域中分离。
4 使用shmctl()解除分配空间

共享内存是Linux中最快速的IPC方法。它也是一个双向过程,共享区域内的任何进程都可以读写内存。这个机制的不利方面是其同步和协议都不受程序员控制,必须确保将句柄传递给了子进程和线程。

例程
-----------------------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PERM S_IRUSR|S_IWUSR

int main(int argc, char **argv)
{
key_t shmid;
char *p_addr, *c_addr;
pid_t pid;
if(argc != 2) {
fprintf(stderr, "Usage:%s\n\a ", argv[0]);
exit(1);
}
if( (shmid = shmget(IPC_PRIVATE, 1024, PERM)) == -1 ) { //(1)
fprintf(stderr, "Create Share Memory Error:%s\n\a ", strerror(errno));
exit(1);
}
pid = fork();
if(pid > 0) {
p_addr = shmat(shmid, 0, 0);
memset(p_addr, '\0 ', 1024);
strncpy(p_addr, argv[1], 1024);
wait(NULL);
exit(0);
}
else if (pid == 0){
sleep(1);
c_addr = shmat(shmid, 0, 0);
printf( "Client get %s\n ", c_addr);
exit(0);
}
}
-----------------------
//IPC_PRIVATE 保证使用唯一ID
//S_IRUSR | S_IWUSR 使当前用户可以读写这个区域
[解决办法]
realloc是一个不足效仿的糟糕设计,何必这么关心。
[解决办法]
使用共享内存就可以了,但是不能分配太多的空间。
而且在使用的时候要注意同步的问题。

热点排行