Comment envoyer une fin de fichier par un tuyau sans fermer le tuyau?

Lorsque j’ouvre un terminal en cours d’exécution bash et que je tape ce qui suit:

cat\nfoo\n^Decho bar\n 

(où \ n est entré et ^ D est control-d) je reçois:

 foo bar 

C’est-à-dire que ^ D provoque la sortie de chat, mais je peux toujours en saisir plus.
Comment pourrais-je envoyer la même entrée (en particulier la fin du fichier) via un canal (unix) en C?

xterm n’effectue pas sa saisie avec le shell et les utilitaires via les pipe(7) . Au lieu de cela, il utilise le framework Unix PTY (voir les forkpty(3) pty(7) , openpty(3) , forkpty(3) , posix_openpt(3) , pts(4) ). La structure PTY permet à tout processus de servir de “maître” de terminal (par exemple, telnetd(8) , sshd(8) , xterm(1) , etc.) et tout processus peut se connecter au terminal esclave pour fournir un environnement interactif comme assis à la console.

Le livre Advanced Programming in the Unix Environment, 2e édition de Stevens and Rago contient un excellent chapitre sur l’utilisation de dispositifs pseudo-terminaux pour contrôler les programmes esclaves – y compris un excellent petit programme pty qui permet de piloter des programmes “interactifs” d’une manière similaire expect(1) , mais en C plutôt qu’en tcl .

Control-D est spécial pour le terminal, pas pour l’entrée générale. Fermez simplement le tuyau.