【发布时间】:2011-01-19 08:05:19
【问题描述】:
在 Unix 网络编程中有一个 Pre-forked 服务器的示例,它使用 Unix 域管道上的消息传递来指示子进程处理传入连接:
for ( ; ; ) {
rset = masterset;
if (navail <= 0)
FD_CLR(listenfd, &rset); /* turn off if no available children */
nsel = Select(maxfd + 1, &rset, NULL, NULL, NULL);
/* 4check for new connections */
if (FD_ISSET(listenfd, &rset)) {
clilen = addrlen;
connfd = Accept(listenfd, cliaddr, &clilen);
for (i = 0; i < nchildren; i++)
if (cptr[i].child_status == 0)
break; /* available */
if (i == nchildren)
err_quit("no available children");
cptr[i].child_status = 1; /* mark child as busy */
cptr[i].child_count++;
navail--;
n = Write_fd(cptr[i].child_pipefd, "", 1, connfd);
Close(connfd);
if (--nsel == 0)
continue; /* all done with select() results */
}
如您所见,父级将套接字的文件描述符编号写入管道,然后在文件描述符上调用close。当 preforked 子进程完成套接字时,他们也会在描述符上调用 close。让我陷入循环的事情是,因为这些孩子是预先分叉的,我会假设只有在孩子分叉时存在的文件描述符才会被共享。但是,如果这是真的,那么这个例子会非常失败,但它确实有效。
有人能解释一下父进程在分叉后创建的文件描述符是如何最终与子进程共享的吗?
【问题讨论】:
标签: linux unix sockets network-programming