Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用共享内存将addrinfo结构从子级传递到父级_C - Fatal编程技术网

C 使用共享内存将addrinfo结构从子级传递到父级

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

我想使用共享内存将getaddrinfo结构(*res)的输出传递到父进程(从子进程),如下所示

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;