2011-08-22 141 views
3

传递addrinfo中结构从子到父我想使用共享存储器如下使用共享存储器

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的传递的getaddrinfo结构(* RES)的输出转换成父对象(从子)的过程,但它没有由于addrinfo所需的内存分配而有所帮助。

预先感谢您的时间和帮助

问候 马诺

回答

1

像你想实现与fork /流程,这是一个真的异步DNS查找这听起来我不好主意。如果你不希望一个异步DNS库,只需使用线程,而不是fork。然后,将得到struct addrinfo已经在你的程序的地址空间,它可以被调用者使用(释放)。

新的线程应该调用getaddrinfo并告知来电时,它完成;你用来通知调用者的方法应该取决于你的程序的事件处理是如何工作的。假设它是单线程的,那么你可能使用了select/poll(或者像libevent那样的抽象),因此线程可以使用管道,你可以使用select来指示查询完成的时间。

P.S.切勿使用shmget等,除了需要它的传统接口(如X11)。有更清洁更现代的方式来做共享内存,如mmapMAP_SHARED|MAP_ANONYMOUS(对于匿名共享内存,您将只与您的fork版儿童共享)或shm_open(POSIX命名共享内存)或甚至mmap的普通文件...

+0

谢谢你的建议,我完全想实现这一点。 – user905538

1

尝试父代码更改为:

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++ ..

BTW。如果你能保证共享内存段将可以为您所需要的addrinfo时间,你可以简单地把指针,例如

struct addrinfo* servinfoP = (struct addrinfo*) shmP; 

同样,在这里你不需要单独配置...

5

这是行不通的。 addrinfo结构包含指向其他内存区域的指针,最重要的是结果链接列表。如果您想通过共享内存传递它,您需要将其平坦化。

如:

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; 

(多个结果作为一个练习)

+0

+1,忘记了内部指针... – Nim