जवाबों:
मुझे विश्वास नहीं होता कि यह संभव है। कार्यकारी (2) सिस्टम कॉल हमेशा एक फ़ाइल नाम या निरपेक्ष पथ की आवश्यकता है (फ़ाइल नाम हमेशा एक है char*
)। posix_spawn
फ़ाइल नाम के लिए भी समान आवश्यकताएं हैं।
निकटतम आप कर सकते हैं एक नामांकित पाइप में आउटपुट पाइप है और पाइप से निष्पादित करने का प्रयास करें। यह काम कर सकता है, हालांकि शेल किसी भी फ़ाइल को निष्पादित करने से इनकार कर सकता है जिसमें --x--x--x
बिट्स सेट नहीं है । साथ पाइप बनाएं mkfifo(1)
और देखें कि क्या आप इसे काम करने के लिए प्राप्त कर सकते हैं।
एक अन्य दृष्टिकोण यह होगा कि कुछ लिखा जाए जो मानक इनपुट को पढ़ता है, एक अस्थायी क्षेत्र में एक फ़ाइल को लिखता है, उस पर --x बिट्स सेट करता है, कांटे और निष्पादित करता है फिर फ़ाइल को हटा देता है। इनोड और सामग्री तब तक रहेगी जब तक कि प्रोग्राम निष्पादित नहीं हो जाता है, लेकिन यह फ़ाइल सिस्टम के माध्यम से सुलभ नहीं होगा। जब प्रक्रिया समाप्त हो जाती है तो इनोड जारी किया जाएगा और भंडारण को मुफ्त सूची में लौटा दिया जाएगा।
संपादित करें: जैसा कि मैट बताते हैं, पहला दृष्टिकोण काम नहीं करेगा क्योंकि लोडर निष्पादन योग्य में मांग-पृष्ठ का प्रयास करेगा, जो फ़ाइल पर यादृच्छिक खोज ट्रैफ़िक उत्पन्न करेगा, और यह एक पाइप पर संभव नहीं है। यह दूसरी तरह के दृष्टिकोण को छोड़ देता है।
मेम्फ़ड syscall का उपयोग करके एक समाधान: 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);
memfd.h
जब तक आप उपयोग नहीं करना चाहते हैं, तब तक आपको शीर्ष लेख की आवश्यकता नहीं है MFD_CLOEXEC
(जो #! /bin/sh
कि लिनक्स में बग के कारण स्क्रिप्ट को तोड़ देगा fexecve()
)। यह बहुत जटिल नहीं है, आप अपने जवाब में 20-लाइन वर्किंग सैंपल को शामिल कर सकते हैं (जैसे। यह git gist - हालांकि यह आपके लिए ड्रॉप-इन रिप्लेसमेंट नहीं है elfexec
, क्योंकि यह आपको निर्दिष्ट करने की भी अनुमति देगा argv[0]
, और बाइनरी चलाएगा केवल एक पाइप से (UUoC अनिवार्य; ;-))
.o
/ tmp में फाइल लिखेगा और यदि यह नहीं हो सका तो मर जाएगा।
यह स्वचालित रूप से आपके कोड का संकलन चलाएगा, लेकिन इसे करने के लिए फ़ाइल सिस्टम पर एक फ़ाइल (टेम्परली) बनाता है।
echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out
(मैं अभी यह परीक्षण कर रहा हूं, लेकिन मुझे पूरा यकीन है कि यह या इसके कुछ करीब आपके लिए काम करेगा)
संपादित करें: यदि आपके पाइपिंग का लक्ष्य गति के लिए समीकरण से बाहर भौतिक डिस्क को काटने के लिए है, तो इंटरमीडिएट फ़ाइल को रखने के लिए राम डिस्क बनाने पर विचार करें ।
csh
।
जैसे @TheQUUX ने सुझाव दिया, मैंने इसे स्वयं परीक्षण नहीं किया है, लेकिन आप कोशिश कर सकते हैं cling
- "एलएलवीएम और क्लैंग लाइब्रेरी के शीर्ष पर बनाया गया इंटरएक्टिव सी ++ इंटरप्रेटर।"
अधिक जानकारी यहां पाएं: https://cdn.rawgit.com/root-project/cling/master/www/index.html
csh
।