2009-06-17 12 views
1

J'ai une application java ici qui démarre une application C++ via l'API java.lang.Process et essaie ensuite d'envoyer des commandes via le tuyau de stdin:Problème de communication entre Java et C++ application sur stdin

 
process.getOutputStream().write("foo\n"); 
process.getOutputStream().flush(); 

Côté C++, une boucle vérifie l'entrée dans stdin et s'il y en a une , elle la lit. Malheureusement, la vérification retourne toujours 0, donc il n'essaie jamais de lire. Si je retire le chèque, il commencera soudainement à voir les commandes et à les traiter. C'est sur Linux.

Le code des applications C++ pour vérifier et lire stdin est ceci:

 
fd_set fds; 
FD_ZERO (&fds); 
FD_SET (0, &fds); 

struct timeval tv; 
tv.tv_sec = 0; 
tv.tv_usec = 0; 


if(select (1, &fds, 0, 0, &tv) > 0) { 
    char buf[16384]; 
    buf[16383] = '\0'; 
    if (fgets (buf, sizeof (buf) - 1, stdin) == 0) 
     return; 
} 

Comme je l'ai dit, en supprimant la clause if fait fonctionner, mais bien sûr thats pas si agréable que la boucle autour d'elle fait aussi d'autres choses. Quelqu'un a une idée de ce que je fais mal ici?

Mise à jour: En attendant, j'ai pu reproduire le problème avec deux exemples d'applications très petites. Le problème semble être lié au framework Qt ici, dès que je crée l'instance QCoreApplication nécessaire pour le framework alors select() pour stdin ne semble plus fonctionner.

+0

devrait utiliser ' fgets (BUF, sizeof (BUF), stdin) '' non sizeof (BUF) - 1' – user102008

Répondre

0

Je peux me tromper, mais le fait d'avoir un délai d'attente de 0 pour l'appel select est logique? Je voudrais essayer d'augmenter la valeur du délai d'expiration.

+0

ne change rien pour l'augmenter (essayé jusqu'à 500 usecs) –

1

Vous avez deux si; Enlever lequel on le fait fonctionner?

Ne pas fgets() attente pour un saut de ligne, tampon complète, ou EOF avant son retour? Je ne vous vois pas écrire une nouvelle ligne, "foo" ne remplit pas le tampon, et puisque le flux n'est pas fermé, voit-il un EOF?

+0

la première et si oui, l'écriture que j'ai fourni ici n'a pas reflété ce que j'ai dans le code, juste changé ça. –

0

Je me souviens qu'il y ait beaucoup d'arguments au sujet de la sémantique et de select() et un couple de remplacement pour elle. Vous pourriez les regarder.

Comment le flux que vous lisez est-il créé/ouvert? Est-ce un flux tamponné? Peut-être n'obtiendrez-vous rien parce qu'il n'a pas été écrit dans le courant avant que le processus d'écriture ne le vide?

L'autre chose que vous pourriez essayer est de le mettre sur un fil avec un blocage d'E/S au lieu du scrutin.

Bonne chance avec elle

0

Active son pas QCoreApplication que je pouvais reproduire maintenant le problème deux fois avec dehors. On dirait que le problème est le fgets() que j'utilise, en le remplaçant par read() le corrige.

0

Est-ce que le dessous est dans la boucle while? Sinon, ça devrait l'être.

FD_ZERO (&fds); 
FD_SET (0, &fds); 

struct timeval tv; 
tv.tv_sec = 0; 
tv.tv_usec = 0; 

Si la réponse à ma première question est oui, alors s'il vous plaît essayer ce délai d'attente:

tv.tv_sec = 0; 
tv.tv_usec = 1; 

Si cela ne fonctionne pas, essayez ceci:

while(fgets(buf, sizeof (buf) - 1, stdin) !=NULL) 
{ 
} 
+0

devrait être 'sizeof (chemin)' au lieu de 'sizeof (chemin) -1' – user102008

Questions connexes