C 使用共享内存将addrinfo结构从子级传递到父级
我想使用共享内存将getaddrinfo结构(*res)的输出传递到父进程(从子进程),如下所示C 使用共享内存将addrinfo结构从子级传递到父级,c,C,我想使用共享内存将getaddrinfo结构(*res)的输出传递到父进程(从子进程),如下所示 pid = fork(); if (pid == 0) { ..... iStatus = getaddrinfo(argv[1], NULL, &hints, &servinfoC); ... shmid = shmget(GETADDR_SHM_KEY, SHMSZ, IPC_CREAT | 0666); .... shmC = s
pid = fork();
if (pid == 0)
{
.....
iStatus = getaddrinfo(argv[1], NULL, &hints, &servinfoC);
...
shmid = shmget(GETADDR_SHM_KEY, SHMSZ, IPC_CREAT | 0666);
....
shmC = shmat(shmid, (void*)NULL, 0));
memcpy(shmC, servinfoC, sizeof(struct addrinfo));
freeaddrinfo (servinfoC);
}
else
{
struct addrinfo *servinfoP;
while ((pid = waitpid (pid, &status, WUNTRACED | WCONTINUED)) > 0)
shmid = shmget(GETADDR_SHM_KEY, SHMSZ, 0666 | IPC_CREAT);
shmP = shmat(shmid, (void*)NULL, 0));
/*HELP Copy shmP to servinfoP struct*/
}
我尝试了memcpy,但是没有用,因为addrinfo需要内存分配
提前感谢您的时间和帮助
问候
Manoj尝试将父代码更改为:
struct addrinfo servinfoP;
while ((pid = waitpid (pid, &status, WUNTRACED | WCONTINUED)) > 0)
shmid = shmget(GETADDR_SHM_KEY, SHMSZ, 0666 | IPC_CREAT);
shmP = shmat(shmid, (void*)NULL, 0));
memcpy(&servinfoP, shmP, sizeof(struct addrinfo));
现在,您不必担心servinfoP
的空间-当然,如果您希望在当前上下文之外提供此功能,那么您必须malloc
struct addrinfo* servinfoP = (struct addrinfo*) calloc(sizeof(struct addrinfo));
注:这都是C,不是C++ +
顺便说一句,如果您可以保证共享内存段在您需要的addrinfo
期间可用,您可以简单地转换指针,例如
struct addrinfo* servinfoP = (struct addrinfo*) shmP;
同样,这里您不需要单独分配…这将不起作用。addrinfo结构包含指向其他内存区域的指针,其上是结果的链接列表。如果要通过共享内存传递,则需要将其展平 例如:
(多个结果留作练习)在我看来,您似乎试图使用
fork
/进程实现异步DNS查找,这是一个非常糟糕的主意。如果不需要异步DNS库,只需使用线程而不是fork
。然后生成的struct addrinfo
已经在程序的地址空间中,调用者可以使用(并释放)它
新线程应该调用getaddrinfo
,并在完成时通知调用方;通知调用方的方法应取决于程序的事件处理方式。假设它是单线程的,您可能正在使用select
/poll
(或其抽象,如libevent
),因此线程可以使用一个管道,您可以select
打开它来指示何时完成查找
请注意,除了需要它的旧接口(如X11)外,不要使用
shmget
等。有更干净、更现代的方法来实现共享内存,比如mmap
与MAP|u shared | MAP_ANONYMOUS
(用于只与fork
ed孩子共享的匿名共享内存)或shm_open
(POSIX命名为共享内存)甚至是普通文件的mmap
。谢谢你的建议,我正是想实现这一点。
struct addrinfo_flat
{
int ai_family;
int ai_socktype;
int ai_protocol;
struct sockaddr_storage ai_addr;
socklen_t ai_addrlen;
};
struct addrinfo_flags *addrs = (struct addrinfo_flat*)shmC;
addrs->ai_family = ai->ai_family;
addrs->ai_socktype = ai->ai_socktype;
addrs->ai_protocol = ai->ai_protocol;
memcpy(&addrs->ai_addr, ai->ai_addr, ai->ai_addrlen);
addrs->ai_addrlen = ai->ai_addrlen;