gpt4 book ai didi

unix - 使用 unix 域套接字传递的描述符

转载 作者:行者123 更新时间:2023-12-03 11:52:38 25 4
gpt4 key购买 nike

当我们想将描述符从子进程传递给进程时,UNP V1(Unix 网络编程 V1)指定了一个复杂的过程来执行此操作,首先创建 msghdr 结构,然后创建一些东西,等等。

为什么我们不能像我们通过 unix 域套接字发送、接收其他数据一样将描述符作为普通数据手段传递?
我能够理解这个过程。请解释那本书中给出的方法。

此外,在那本书中,在 read_fd() 函数中,他声明了联合以正确对齐 msghdr 结构。工会如何使其保持一致?为什么需要对齐?

最佳答案

Why cant we pass a descriptor as normal data means as we do send , recv for other data through unix domain sockets?



因为打开的文件描述符不能有效地序列化为字节流。

虽然文件描述符实际上只是整数,但它们被内核(以每个进程的方式)映射到内核内部的数据结构,这些数据结构描述了打开的"file"(它是“普通”文件吗?是一个 block /character 特殊设备?它是某种网络套接字吗?它是匿名管道吗?等等)。文件描述符传递的目标是在某个其他(可能不相关的)进程中创建一个新的文件描述符(可能具有其他整数值),该进程映射到与发送进程中的原始描述符相同的内核内部数据结构。

你必须经历的诡计只是访问此功能的“API”(请注意,基于 System V 的 Unix 系统有另一种基于 STREAMS 的文件描述符传递方法,它使用不同的“API”)。我不知道历史,但我猜 BSD 文件描述符传递“API”的“复杂性”是由于将功能硬塞到预先存在的 sendmsg(2)/recvmsg(2) 中。 API。

How union makes it aligned? and why alignment is required?



我面前没有 UNP 实现,但使用联合并不是唯一的方法。 Kragen Sitaker's portlisten example使用 CMSG_ * 宏而不是联合。这个想法是确保 <struct msghdr>.msg_control指向 <struct cmsghdr> .

关于unix - 使用 unix 域套接字传递的描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1788095/

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