在属于同一父进程的多个子进程之间共享内存

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);

}