gpt4 book ai didi

linux - 父级和预 fork 子级之间的文件描述符共享

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:42 25 4
gpt4 key购买 nike

在 Unix 网络编程中有一个预 fork 服务器的示例,它使用在 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。当预 fork 的 child 完成套接字时,他们也会在描述符上调用关闭。让我陷入困境的是,因为这些 child 是预 fork 的,所以我会假设只有在 child fork 时存在的文件描述符才会被共享。然而,如果那是真的,那么这个例子就会失败,但它仍然有效。

有人可以阐明父进程在 fork 之后 创建的文件描述符是如何最终与子进程共享的吗?

最佳答案

看一下 Write_fd 的实现。它使用类似

union {
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof(int))];
} control_un;
struct cmsghdr *cmptr;

msg.msg_control = control_un.control;
msg.msg_controllen = sizeof(control_un.control);

cmptr = CMSG_FIRSTHDR(&msg);
cmptr->cmsg_len = CMSG_LEN(sizeof(int));
cmptr->cmsg_level = SOL_SOCKET;
cmptr->cmsg_type = SCM_RIGHTS;
*((int *) CMSG_DATA(cmptr)) = sendfd;

也就是说,发送类型为 SCM_RIGHTS 的控制消息是 unix 可以与无关进程共享文件描述符的一种方式。

关于linux - 父级和预 fork 子级之间的文件描述符共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2305865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com