Existe-t-il un moyen d'exécuter un binary natif à partir d'un tuyau?

echo 'main(){}' | gcc -xc - -o /dev/stdout | ??? 

Existe-t-il un moyen d'exécuter le binary de sortie sur un système de type Unix?

EDIT: J'avais besoin d'exécuter la sortie de g ++ dans un environnement bac à sable où je ne peux pas écrire de file (rien de malicieux, je le promets).

Je ne crois pas que ce soit possible. L'appel système exec (2) nécessite toujours un nom de file ou un path absolu (le nom de file est toujours un caractère char* ). posix_spawn également des exigences similaires pour un nom de file.

Le plus proche que vous pourriez faire est de canaliser la sortie dans un canal nommé et d'essayer d'exécuter à partir du canal. Cela peut fonctionner, bien que le shell puisse refuser d'exécuter n'importe quel file qui ne possède pas les bits --x--x--x . Créez le tube avec mkfifo(1) et voyez si vous pouvez le faire fonctionner.

Une autre approche consisterait à écrire quelque chose qui lit une input standard, écrit un file dans une zone temporelle, y place les bits –x, les forks et les execs, puis supprime le file. L'inode et le contenu restront jusqu'à ce que le programme ait fini de s'exécuter, mais il ne sera pas accessible par le système de files. Lorsque le process se termine, l'inode sera libéré et le stockage sera renvoyé à la list libre.

EDIT: Comme Mat le fait remarquer, la première approche ne fonctionnera pas car le chargeur essaiera de requestr une page dans l'exécutable, ce qui générera du trafic de search random sur le file, ce qui n'est pas possible sur un canal. Cela laisse une sorte d'approche comme la seconde.

Cela va automatiquement exécuter la compilation de votre code, mais crée un file (temparaily) sur le système de files pour le faire.

 echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out 

(Je teste actuellement cela maintenant, mais je suis sûr que cela, ou quelque chose de proche fonctionnera pour vous)

EDIT: Si le but de votre tuyauterie est de couper les disques physiques de l'équation pour la vitesse, envisager de créer un disque RAM pour contenir le file intermédiaire.

Vous pouvez essayer tcc , qui va comstackr et exécuter un programme en une seule étape, sans écrire de files intermédiaires. Ce n'est pas gcc, ce qui peut être un problème pour vous, mais il est spectaculairement rapide, donc il peut même parier mieux que gcc pour vos fins.