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



我正在尝试创建基于主/从架构的客户端/服务器应用程序。父服务器负责处理来自客户端的新的套接字请求,并使用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);
}

最新更新