跨进程共享文件句柄:p1通过共享内存传句柄给p2能否使用?
这个问题的答案得看你使用的操作系统——不同平台对文件句柄/描述符的管理逻辑差异很大,我给你梳理两种最常见的场景:
Windows 平台
直接把p1的文件句柄数值写到共享内存让p2读取,大概率是没法正常使用的。因为Windows里每个进程都有自己独立的句柄表,同一个句柄数值在不同进程里指向的对象可能完全不同,甚至是无效的。
如果要让p2正常使用这个文件句柄,正确的做法是调用DuplicateHandle API:p1需要把自己的句柄、p2的进程句柄作为参数,复制出一个属于p2进程的有效句柄,再把这个新句柄的数值通过共享内存(或者其他IPC方式)传给p2,这样p2拿到的句柄才能正常操作文件。
Linux/Unix 平台
这里对应的概念是文件描述符(FD),同样的,文件描述符是进程私有的索引——p1里的FD数值比如3,在p2的进程里可能指向另一个完全无关的文件,或者干脆是无效的。
如果想让p2访问同一个文件,直接传FD数值到共享内存是行不通的。你需要用专门的IPC机制来传递文件描述符,比如通过UNIX域套接字调用sendmsg和recvmsg来传递FD,这种方式会在内核层面为p2创建对应的FD,指向同一个文件表项,这样p2才能正常操作文件。
总结一下:不管哪个平台,直接通过共享内存传递原始的句柄/FD数值都没法让p2正常使用,必须使用对应平台提供的进程间共享文件句柄的标准机制。
内容的提问来源于stack exchange,提问作者haris
相关产品推荐
相关产品推荐

