J'essaye d'écrire une application qui peut se connecter à SSH avec un mot de passe, en utilisant des pseudo-terminaux. Mais si j'écris() sur l'appareil maître, les données n'apparaissent pas dans l'appareil esclave. Voici un exemple simple de test:Processus enfant incapable de lire à partir du pseudo-terminal créé
#include <sys/wait.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#ifdef __linux__
#include <pty.h>
#else
#include <util.h>
#endif
int
main() {
int master;
pid_t pid = forkpty(&master, NULL, NULL, NULL);
if (pid == 0) {
int ch;
read(0, &ch, 1);
_exit(1);
} else {
printf("Press Enter to send a byte.\n");
getchar();
write(master, "1", 1);
printf("Done. Waiting for process to exit...\n");
waitpid(pid, NULL, 0);
return 0;
}
}
L'application première sortie « Appuyez sur Entrée pour envoyer un octet ». Après avoir appuyé sur Entrée, j'attends que read() du processus fils revienne. Mais le read() semble bloquer indéfiniment même si le write() du maître réussit, donc le maître attend éternellement sur waitpid(). Que se passe-t-il?
Je ne suis pas sûr de ce que vous utilisez pour cela, mais j'utiliser 'expect' pour quelque chose comme ça. Il est disponible sur la plupart des distributions. http://expect.nist.gov/ –
L'application que j'écris va être distribuée aux utilisateurs qui n'auront peut-être pas 'attendu' ou ne voudront peut-être pas l'installer. D'ailleurs je veux aussi savoir comment faire des pseudo-terminaux au cas où j'en aurais besoin pour autre chose dans le futur. – Hongli
Essayez ceci: write (master, "1 \ n", 2); – sambowry