當我只知道描述符時,我需要執行一個文件。也有可能沒有指向該文件的鏈接,因此不知何故找到該名稱不是一種選擇。所有的execve(),execvp()等函數都有一個文件名。 dlopen()也有一個名字。如何從文件描述符執行程序?
醜陋的解決方案(如讀取文件和調用某些函數指針)都可以。
當我只知道描述符時,我需要執行一個文件。也有可能沒有指向該文件的鏈接,因此不知何故找到該名稱不是一種選擇。所有的execve(),execvp()等函數都有一個文件名。 dlopen()也有一個名字。如何從文件描述符執行程序?
醜陋的解決方案(如讀取文件和調用某些函數指針)都可以。
使用fexecve
。
PS:讀取文件並調用一些函數指針肯定是而不是好的。 :)
有趣。我認爲你最好的選擇是使用FD,你必須編寫一個臨時文件,然後使用普通的exec調用來執行它。
您可以使用mkstemp
來保證唯一的文件名。然後從您的文件描述符中讀取內容並將其轉儲到臨時文件。然後在exec調用中使用mkstemp給你的名字。
如果不出於某種原因想編寫一個新的文件,那麼我認爲你唯一的選擇將是手動解析exe文件的圖像,在內存中正常加載,然後調用它的main()函數。這複製了OS中已經存在的很多功能,我認爲你不想這樣做。這將是很難得到正確的,似乎並不值得努力。
我的意思是沒關係,如果沒有簡單的解決方案。如果我可以調用fexecve(),我不會這麼做。謝謝。 – stribika 2010-05-23 16:42:06
如果fexecve不被支持,你可以用mmap和libelf做一些可怕的事情 - 比如製作一個fdlopen。雖然這會吸引人。不過,我很高興瞭解fexecve。我很想知道,但從來沒有見過它,也從來沒有見過它。 – nategoose 2010-05-23 20:21:56
你也可以使用文件/ dev/fd/n或/ proc/self/fd/n,只需要用文件號替換n並傳遞給一個普通的exec調用。這是如何fexecve它在引擎蓋下。 – 2014-11-10 10:34:29