在属于同一父进程的多个子进程之间共享内存
Share memory between multiple child processes belonging to same parent
我正在尝试创建基于 master/slave 架构的 Client/Server 应用程序。父服务器负责处理来自客户端的新套接字请求,并使用发生客户端交互的 fork()。
我想在应用程序中创建一个链表,子进程在其中添加节点并且每个其他子进程都可以访问它。我曾尝试使用 mmap 和 shmget 创建共享内存,但在第一个子进程创建列表后其他进程无法读取链接列表。
节点结构:
struct node{
char data[1024];
struct node *next;
};
mmap 方法:
void* create_shared_memory(size_t size){
int protection = PROT_READ |PROT_WRITE;
int visibility = MAP_SHARED | MAP_ANONYMOUS;
return mmap(NULL, size, protection, visibility, -1, 0);
}
shmget 方法:
void * my_malloc(int size)
{
void * ptr = NULL;
key_current = key_first++;
int shm_id;
if ((shm_id = shmget(key_current, size , IPC_CREAT | 0666)) < 0) {
perror("shmget error.");printf("errno= %d EINVAL=%d \n ", errno , EINVAL);
return NULL;
}
if ((ptr = shmat(shm_id, NULL, 0)) == (void *) - 1) {
perror("shmat error");
//exit(1);
return NULL;
}
current_index ++ ;
shm_id_arr[current_index] = shm_id ;
return ptr;
}
我通过使用共享内存在父进程中创建一个包含预定义数量 node
元素的数组并在服务器侦听客户端请求和使用 fork()
之前初始化所有索引来解决这个问题。
#define MAX_NODES 1000
typedef struct node{
char data[1024];
} node;
node *nodes;
void init_array(){
int id;
if((id = shmget(12345, sizeof(node)*MAX_NODES , IPC_CREAT | 0666) < 0){
perror("shmget error");
}
nodes = (node*) shmat(id, NULL, 0);
}
我正在尝试创建基于 master/slave 架构的 Client/Server 应用程序。父服务器负责处理来自客户端的新套接字请求,并使用发生客户端交互的 fork()。
我想在应用程序中创建一个链表,子进程在其中添加节点并且每个其他子进程都可以访问它。我曾尝试使用 mmap 和 shmget 创建共享内存,但在第一个子进程创建列表后其他进程无法读取链接列表。
节点结构:
struct node{
char data[1024];
struct node *next;
};
mmap 方法:
void* create_shared_memory(size_t size){
int protection = PROT_READ |PROT_WRITE;
int visibility = MAP_SHARED | MAP_ANONYMOUS;
return mmap(NULL, size, protection, visibility, -1, 0);
}
shmget 方法:
void * my_malloc(int size)
{
void * ptr = NULL;
key_current = key_first++;
int shm_id;
if ((shm_id = shmget(key_current, size , IPC_CREAT | 0666)) < 0) {
perror("shmget error.");printf("errno= %d EINVAL=%d \n ", errno , EINVAL);
return NULL;
}
if ((ptr = shmat(shm_id, NULL, 0)) == (void *) - 1) {
perror("shmat error");
//exit(1);
return NULL;
}
current_index ++ ;
shm_id_arr[current_index] = shm_id ;
return ptr;
}
我通过使用共享内存在父进程中创建一个包含预定义数量 node
元素的数组并在服务器侦听客户端请求和使用 fork()
之前初始化所有索引来解决这个问题。
#define MAX_NODES 1000
typedef struct node{
char data[1024];
} node;
node *nodes;
void init_array(){
int id;
if((id = shmget(12345, sizeof(node)*MAX_NODES , IPC_CREAT | 0666) < 0){
perror("shmget error");
}
nodes = (node*) shmat(id, NULL, 0);
}