Yanıtlar:
Bunun mümkün olduğuna inanmıyorum. Exec (2) sistem çağrısı her bir dosya adı veya kesin yolu gerektirmektedir (dosya, her zaman olduğu char*
). posix_spawn
dosya adı için de benzer gereksinimlere sahiptir.
Yapabileceğiniz en yakın şey, çıkışı adlandırılmış bir boruya bağlamak ve borudan yürütmeyi denemektir. Kabuk, --x--x--x
bitleri ayarlanmamış herhangi bir dosyayı yürütmeyi reddedebilirse de bu işe yarayabilir . Boruyu ile oluşturun ve mkfifo(1)
çalışıp çalışamayacağınızı görün.
Başka bir yaklaşım, standart girdiyi okuyan, bir dosyayı geçici alana yazan, üzerindeki --x bitlerini ayarlayan, çatallar ve yürütmelerden sonra dosyayı silen bir şey yazmak olacaktır. Program ve yürütme işlemi bitene kadar inode ve içerik kalır, ancak dosya sistemi üzerinden erişilemez. İşlem sona erdiğinde inode serbest bırakılacak ve depolama ücretsiz listeye geri döndürülecektir.
DÜZENLEME: Mat'ın işaret ettiği gibi, yükleyici yürütülebilir dosyadaki talep sayfasını çalışmaya çalışacağından ilk yaklaşım çalışmaz, bu da dosyada rastgele arama trafiği oluşturur ve bu bir kanalda mümkün değildir. Bu, ikincisi gibi bir tür yaklaşım bırakır.
Memfd syscall kullanan bir çözüm: https://github.com/abbat/elfexec
Bellekte kullanılabilecek adlandırılmış bir dosya tanımlayıcı oluşturur exec
. Bir sözde kod:
#include <linux/memfd.h>
...
int memfd = syscall(SYS_memfd_create, "someName", 0);
...
write(memfd,... elf-content...);
...
fexecve(memfd, argv, environ);
memfd.h
istemediğiniz sürece başlığa ihtiyacınız yoktur (linux'daki hatalar nedeniyle komut dosyalarını MFD_CLOEXEC
kırar ). Bu çok karmaşık değil, cevabınıza 20 satırlık bir çalışma örneği ekleyebilirsiniz (örn. Bu git gist - bu sizin için bir damla yerine geçmez , çünkü bu da belirtmenize izin verir ve bir ikili çalıştırır) sadece bir borudan (UUoC zorunlu ;-))#! /bin/sh
fexecve()
elfexec
argv[0]
.o
/ tmp dosyasına dosya yazacak ve yapamazsa ölecektir.
Bu, kodunuzun derlenmesini otomatik olarak çalıştırır, ancak bunu yapmak için dosya sisteminde (geçici olarak) bir dosya oluşturur.
echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out
(Şu anda bunu test ediyorum, ancak bunun eminim, ya da buna yakın bir şey sizin için çalışacaktır)
DÜZENLEME: Boru tesisatınızın amacı, fiziksel diskleri hız denkleminden kesmekse , ara dosyayı tutmak için bir ram diski oluşturmayı düşünün .
csh
.
@TheQUUX'un önerdiği gibi , ben kendim test etmedim ama denemek isteyebilirsiniz cling
- "LLVM ve Clang kütüphanelerinin üzerine inşa edilmiş interaktif C ++ yorumlayıcısı."
Daha fazla bilgiyi burada bulabilirsiniz: https://cdn.rawgit.com/root-project/cling/master/www/index.html
csh
.