使用UNIX套接字将文件描述符从同一主机上的一个程序传递到另一个程序

我有两个prpr让我们说prog1和prog2。 我正在用prog1打开一个文件,并对它进行一些操作。 现在没有在prog1中closures文件,我使用unix套接字将其文件描述符发送到prog2,然后在其中执行一些操作。

虽然我得到了相同的描述符,我在prog1中传递,但是在prog2中接收到的fd上执行fstat()时会抛出错误,说错误的文件描述符。 我已经在prog1中打开了文件,其中corerct权限是读取和写入的,但仍然出现错误。

为什么会这样呢? 如果我的方式传递文件描述符是错误的,那么请build议一个正确的。

我相信这个网站有你在找什么:

http://www.lst.de/~okir/blackhats/node121.html

Linux的man 7 unix也有关于使用SCM_RIGHTS和Unix套接字的其他功能的信息。

修复损坏的链接: http : //web.archive.org/web/20131016032959/http : //www.lst.de/~okir/blackhats/node121.html

这个是正常的。 每个程序都有自己的文件描述符。

编辑 :好吧,似乎你可以传递文件描述符使用本地套接字。

您可以在/proc/PID/fd看到它们,它们通常是符号链接到您的文件。 你可以用unix套接字做什么,允许使用sendmsg / recvmsg从一个程序写入一个文件到另一个程序。 看到这个问题更多的细节。

但是有一个更好的方法可以同时写入一个文件。 你可以使用fifo,shm,甚至可以在你的两个程序之间传递你的偏移位置。

文件描述符是一个小的int值,可以让你访问一个文件。 它是一个文件描述符表的索引,这是内核中与每个进程相关的数据结构。 一个进程不能对另一个进程的文件描述符做任何有意义的事情,因为它不能访问任何其他进程的文件描述符表。

这是基于安全原因。 如果一个进程能够对属于另一个进程的打开文件执行操作,那么就会出现混乱。 另外,一个文件描述符只是没有足够的信息去做你想做的事情; 一个进程的文件描述符0(stdin)可能会引用与另一个进程的文件描述符0完全不同的文件。即使它们碰巧是相同的文件,每个进程也需要维护自己关于该打开文件状态的信息它的读/写等等)。

如果你要描述你想要完成的事情,或许我们可以提供帮助。

编辑:

您想要将数据从一个程序传递到另一个程序。 最直接的方法是创建一个管道( man 2 pipe )。 请注意,第二个过程将必须是第一个孩子。

另一种方法是创建第二个进程可以打开和读取的文件(不要共享文件描述符),也可以使用套接字。