2013-04-04 42 views
2

我拥有的是进程ID和来自该进程的文件描述符。除了sendmsg之外,还有什么办法可以复制(或重新打开)该进程的文件描述符以供Linux中的其他进程使用?Linux中另一个进程的重复文件描述符(不带sendmsg)

Windows为此具有DuplicateHandle,我不知道Linux上是否有类似的东西。

+0

简短而唯一的答案是:不可以。原因是文件描述符只是表中的索引,而且每个表每个进程都是唯一的,所以不能简单地在另一个进程中使用一个描述符。 – 2013-04-04 11:04:53

+0

我已更新我的问题。我想在另一个进程中重新打开文件描述符。像这里描述的东西[这里](http://stackoverflow.com/questions/2358684/can-i-share-a-file-descriptor-to-another-process-on-linux-or-are-they-local到t)但没有sendmsg – Sergey 2013-04-04 11:09:06

+1

答案仍然没有。如果你想在另一个进程中复制句柄,你可以使用'sendmsg'方法。难道其他进程不能自己打开相同的文件,而不是试图从第一个进程获取描述符? – 2013-04-04 11:11:53

回答

1

如果您拥有适当的权限,则PID为43512的进程的文件描述符5位于/proc/43512/fd/5。我从来没有把这些事情搞得一团糟(除了偷看之外),所以在那里写作可能会工作得很好,或者举行壮观的焰火表演。

+0

你不能像这样打开插座:/ – ysdx 2015-03-28 18:37:55

3

As + vonbrand指出你可以使用/proc/<pid>/fd/<fd>。但是你不能只是“写在那里”,它不会给任何冷杉。

这是一个特殊的符号链接,该文件与pid <pid>作为文件描述符<fd>打开。

只需使用它在您的过程中打开完全相同的文件即可。

您不必担心原始文件被删除或替换,因为使用此链接将始终为您提供打开过程的原始文件。刚刚尝试下面的小块的bash代码:

#!/bin/bash 
echo "test" >/tmp/file 
ls -li /tmp/file 
exec 3<> /tmp/file 
rm /tmp/file 
ls -lLi /proc/$$/fd/3 
cat /proc/$$/fd/3 

这将创建一个包含字符串测试文件/tmp/file。打开文件作为文件描述符,删除它,删除后仍然可以通过/proc/self/fd/3cat其内容。在linux中,只要任何进程仍然使用它,文件就不会被最终删除。

因此,不用获取和使用进程的文件描述符,只需打开文件描述符“指向”即可。

当然,您需要这样做的权利/权限/特权。如果您拥有这两个进程或者您是root用户,那么您拥有哪一个。

编辑:如果不是在bash中,您也可以使用/proc/self/...而不是/proc/$$/...来获取有关当前进程的信息。

+0

这看起来正是我所需要的。将尝试一下。 – Sergey 2013-04-04 18:13:33

相关问题