Ceci est mon premier post ici, alors s'il vous plaît excuser tous les problèmes de mise en forme.STDIN semble être cassé après l'appel à "système" en invoquant mpiexec
J'ai un programme interactif qui génère des processus externes et surveille leurs E/S. Les choses fonctionnent bien jusqu'à ce que je génère quelque chose avec "mpiexec", après quoi STDIN semble rompre.
Je me rends compte que ce sera difficile à reproduire pour la plupart des gens, mais si quelqu'un voit quelque chose d'évident ou connaît ce problème .... s'il vous plaît aider!
Voici un extrait:
int main(...)
{
std::string choice;
while(std::getline(std::cin,choice)){
if(!choice.empty()){
if(choice == "Parallel"){
system("mpiexec ./aprogram");
}
if(choice == "Serial"){
system("./aprogram");
}
// Now the external process is done... so far, so good
std::cout << "Program is done. Press ENTER to continue."
<< std::endl;
// This next line *works* if the external process was serial
// But *fails* when "mpiexec" was invoked
std::getline(std::cin,choice);
if(std::cin.eof()){
std::cout << "STDIN has been closed." << std::endl;
exit(1);
}
}
}
}
J'ai essayé beaucoup de diverses choses, par exemple pipes, forking explicite, gestion des descripteurs méticuleuse. La chose la plus étrange est que si je saute et stdin stdin et restaure après le retour de "mpiexec", alors je n'ai plus EOF sur std :: cin, mais à la place, std :: getline (std :: cin, ...) ne bloque plus! Le programme va dans une boucle infinie en lisant zéro octet de std :: cin dans l'appel de std :: readline. Si, pendant que le processus externe s'exécute sous mpiexec, je superpose un tas de données dans std :: cin (par exemple en tapant), alors les appels suivants à std :: readline analysent correctement les lignes de données que j'ai bloquées là-bas, mais encore une fois ... une fois qu'il a fini de lire ces données, il continue juste dans une boucle infinie (c'est-à-dire ne pas bloquer sur std :: readline (std :: cin, ..) même s'il n'y a pas de données lire! Ugh. donc ennuyeux.
Toute aide est très apprécié.
Cheers!
Quelle implémentation MPI utilisez-vous, sur quelle plateforme? –
Nous utilisons actuellement des implémentations MPI MPICH (plusieurs versions, notamment MVAPICH, MPICH2 vanille et MPICH-MX) sur plusieurs plates-formes Linux différentes (dont la majorité sont basées sur S.L. ou CentOS). Je n'ai pas essayé avec OpenMPI, mais certaines applications de ce système intégré ne fonctionnent pas bien avec OpenMPI. Je crois que le problème doit être centré sur quelque chose que "mpiexec" fait avec STDIN. Je vais essayer d'obtenir un meilleur extrait afin qu'il puisse être facilement reproduit avec vanille mpich. – user1950175
Je peux reproduire votre problème avec votre exemple de code et MPICH-3.0.1. Je regarde dedans. –