Câu trả lời:
Tôi không tin điều này là có thể. Cuộc gọi hệ thống exec (2) luôn yêu cầu tên tệp hoặc đường dẫn tuyệt đối (tên tệp luôn là a char*
). posix_spawn
cũng có yêu cầu tương tự cho một tên tệp.
Cách gần nhất bạn có thể làm là chuyển đầu ra thành một ống có tên và thử thực hiện từ đường ống. Điều đó có thể hoạt động, mặc dù shell có thể từ chối thực thi bất kỳ tệp nào không có --x--x--x
bit được đặt. Tạo đường ống với mkfifo(1)
và xem nếu bạn có thể làm cho nó hoạt động.
Một cách tiếp cận khác là viết một cái gì đó đọc đầu vào tiêu chuẩn, ghi một tệp ra khu vực tạm thời, đặt các bit --x trên đó, rẽ nhánh và thực thi sau đó xóa tệp. Inode và nội dung sẽ vẫn còn cho đến khi chương trình kết thúc thực thi nhưng nó sẽ không thể truy cập được thông qua hệ thống tệp. Khi quá trình kết thúc, inode sẽ được giải phóng và bộ nhớ sẽ được đưa trở lại danh sách miễn phí.
EDIT: Như Mat chỉ ra, cách tiếp cận đầu tiên sẽ không hoạt động vì trình tải sẽ cố gắng yêu cầu trang trong tệp thực thi, điều này sẽ tạo ra lưu lượng tìm kiếm ngẫu nhiên trên tệp và điều này không thể thực hiện được trên đường ống. Điều này để lại một số cách tiếp cận như thứ hai.
Một giải pháp sử dụng tòa nhà memfd: https://github.com/abbat/elfexec
Nó tạo ra một mô tả tập tin có tên trong bộ nhớ có thể được sử dụng trong exec
. Mã giả:
#include <linux/memfd.h>
...
int memfd = syscall(SYS_memfd_create, "someName", 0);
...
write(memfd,... elf-content...);
...
fexecve(memfd, argv, environ);
memfd.h
tiêu đề trừ khi bạn muốn sử dụng MFD_CLOEXEC
(sẽ phá vỡ #! /bin/sh
các tập lệnh vì lỗi trong linux ' fexecve()
). Điều đó không quá phức tạp, bạn có thể bao gồm một mẫu làm việc 20 dòng trong câu trả lời của mình (ví dụ: ý chính này - mặc dù đó không phải là sự thay thế thả xuống cho bạn elfexec
, vì điều đó cũng sẽ cho phép bạn chỉ định argv[0]
và sẽ chạy nhị phân chỉ từ một đường ống (bắt buộc
.o
tập tin vào / tmp và chết nếu không thể.
Điều này sẽ tự động chạy quá trình biên dịch mã của bạn, nhưng tạo một tệp (tempar Daily) trên hệ thống tệp để thực hiện.
echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out
(Hiện tại tôi đang thử nghiệm điều này, nhưng tôi khá chắc chắn điều này hoặc một cái gì đó gần với nó sẽ hoạt động cho bạn)
EDIT: Nếu mục tiêu của đường ống của bạn là cắt các đĩa vật lý ra khỏi phương trình tốc độ, hãy xem xét việc tạo một đĩa ram để giữ tệp trung gian.
csh
.
Giống như @TheQUUX đã đề xuất, tôi chưa tự mình kiểm tra nhưng bạn có thể muốn dùng thử cling
- "trình thông dịch C ++ tương tác, được xây dựng dựa trên các thư viện LLVM và Clang.".
Tìm thêm thông tin ở đây: https://cdn.rawgit.com/root-project/cling/master/www/index.html
csh
.