Я не полагаю, что это возможно. Должностное лицо (2) системный вызов всегда требует имени файла, или полный путь (имя файла всегда a char*
). posix_spawn
также имеет подобные требования для имени файла.
Самое близкое, которое Вы могли сделать, передать вывод по каналу в именованный канал и попытаться выполниться от канала. Это может работать, хотя оболочка может отказаться выполнять любой файл, который не имеет --x--x--x
биты установлены. Создайте канал с mkfifo(1)
и посмотрите, можно ли заставить это работать.
Другой подход должен был бы записать что-то, что читает стандартный вход, выписывает файл к временной области, устанавливает - x биты на нем, ветвления и должностные лица затем удаляет файл. inode и содержание останутся, пока программа не заканчивает выполняться, но это не будет доступно через файловую систему. Когда процесс завершится, inode будет выпущен, и устройство хранения данных будет возвращено к бесплатному списку.
Править: Как Циновка указывает, первый подход не будет работать, поскольку загрузчик попытается к странице спроса в исполняемом файле, который генерирует случайный, ищут трафик в файле, и это не возможно на канале. Это оставляет своего рода подход как второе.
Это автоматически выполнит компиляцию Вашего кода, но создает файл (temparaily) в файловой системе, чтобы сделать это.
echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out
(Я в настоящее время тестирую это теперь, но я вполне уверен это, или что-то близко к нему будет работать на Вас),
Править: Если цель Вашей передачи по каналу состоит в том, чтобы сократить физические диски из уравнения для скорости, полагайте, что создание диска поршня содержит промежуточный файл.
csh
.
– rozcietrzewiacz
07.10.2011, 18:03
Как и предложил @TheQUUX , я не проверял его на себе, но вы можете попробоватьcling
-«интерактивный интерпретатор C++, построенный поверх библиотек LLVM и Clang».
Подробнее здесь:https://cdn.rawgit.com/root-project/cling/master/www/index.html
Решение с использованием системного вызова memfd:https://github.com/abbat/elfexec
Он создает в памяти именованный файловый дескриптор, который можно использовать в exec
. Псевдо -код:
#include <linux/memfd.h>
...
int memfd = syscall(SYS_memfd_create, "someName", 0);
...
write(memfd,... elf-content...);
...
fexecve(memfd, argv, environ);