如何通过文件描述符执行程序?

7
我需要在只知道文件描述符的情况下执行一个文件。有可能没有任何链接到该文件,因此某种方式找出其名称不是一个选项。所有的execve(), execvp()等函数都需要一个文件名。dlopen()也需要一个名称。
丑陋的解决方案(如读取文件并调用某个函数指针)也可以接受。
2个回答

9
使用 fexecve 函数。
PS:读取文件并调用某些函数指针绝对不是可行的解决方案。 :)

我的意思是,如果没有简单的解决方案也没关系。如果我可以直接调用fexecve(),我就不会这么做。谢谢。 - stribika
如果不支持fexecve,您可以使用mmap和libelf做一些可怕的事情——类似于创建fdlopen。尽管如此那样会很糟糕。我很高兴了解到fexecve,虽然我以前想过,但从未见过它,并且从未必须使用它。 - nategoose
2
你也可以使用文件/dev/fd/n或/proc/self/fd/n,只需将n替换为文件号并将其传递给常规exec调用即可。这就是fexecve在幕后的工作原理。 - Blackle Mori

1

有趣。我认为你最好的选择是使用你拥有的FD来编写一个临时文件,然后使用普通的exec调用来执行它。

你可以使用mkstemp来生成一个保证唯一的文件名。然后从你的文件描述符中读取内容并将其转储到临时文件中。然后在exec调用中使用mkstemp给出的名称。

如果你不想写一个新文件,那么你唯一的选择就是手动解析exe文件图像,在内存中正确加载它,然后调用它的main()函数。这会重复很多操作系统中已经存在的功能,我认为你不想这样做。这很难做到,并且似乎不值得这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接