J'ai examiné ce que vous essayez d'accomplir, car je me souviens avoir voulu faire la même chose. Inspiré par Vinay, j'ai écrit quelque chose qui fonctionne pour moi et que je comprends un peu. Mais je ne suis pas un expert, alors s'il vous plaît soyez prudent.
Je ne sais pas comment Vinay sait que vous utilisez Mac OS X. Mais cela devrait fonctionner un peu de cette façon avec la plupart des systèmes d'exploitation de type unix. Une ressource vraiment utile est opengroup.org
Assurez-vous de vider le tampon avant d'utiliser la fonction.
#include
#include //termios, TCSANOW, ECHO, ICANON
#include //STDIN_FILENO
void pressKey()
{
//la structure termios stocke toutes sortes de drapeaux qui peuvent manipuler l'interface E/S
//J'en ai une ancienne pour sauvegarder les anciens paramètres et une nouvelle
static struct termios oldt, newt;
printf("Appuyez sur une touche pour continuer....\n");
//tcgetattr obtient les paramètres du terminal actuel
//STDIN_FILENO indique à tcgetattr qu'il doit écrire les paramètres
//de stdin dans oldt
tcgetattr( STDIN_FILENO, &oldt);
//maintenant les paramètres seront copiés
newt = oldt;
//deux des c_lflag seront désactivés
//ECHO est responsable de l'affichage de l'entrée de l'utilisateur dans le terminal
//ICANON est essentiel! Normalement, cela garantit qu'une ligne à la fois sera traitée
//cela signifie qu'il retournera s'il voit un "\n" ou un EOF ou une EOL
newt.c_lflag &= ~(ICANON | ECHO );
//Ces nouveaux paramètres seront définis sur STDIN
//TCSANOW indique à tcsetattr de changer les attributs immédiatement.
tcsetattr( STDIN_FILENO, TCSANOW, &newt);
//maintenant, le caractère sera demandé
getchar();
//les anciens paramètres seront réécrits dans STDIN
tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}
int main(void)
{
pressKey();
printf("FIN\n");
return 0;
}
O_NONBLOCK semble également être un indicateur important, mais cela n'a rien changé pour moi.
J'apprécierais que des personnes ayant une connaissance plus approfondie commentent cela et donnent quelques conseils.