2010-07-27 13 views
3

J'utilise popen pour ouvrir un canal d'écriture et envoyer des commandes à une application. Le problème est que les commandes sont uniquement envoyées à l'application lorsque je ferme le canal.Utiliser popen pour écrire dans un tube uniquement envoyer des données lorsque le tube est fermé

FILE * fp = open(target_app, "w"); 
fwrite(command, 1, command.size(), fp); 
getchar(); //wait for a key, because I don't want to terminate the application 
pclose(fp); // at this point, the command is sent 

Qu'est-ce qui pourrait être faux?

Répondre

2

je me dis que juste que je dois vider le tuyau pour envoyer des commandes sans la nécessité de le fermer. Mon correctif était:

FILE * fp = open(target_app, "w"); 
fwrite(command, 1, command.size(), fp); 
fflush(fp); 
getchar(); //wait for a key, because I don't want to terminate the application 
pclose(fp); // at this point, the command is sent 
0

Le tube n'enverra pas les données jusqu'à ce que la fin soit atteinte. Vous devez dire que c'est la fin sinon il va continuer à attendre quelque chose.

Une façon de faire est de faire comme vous: fermer le tuyau. Un autre est d'utiliser fflush (le meilleur à mon avis). Vous pouvez écrire un \ n aussi je suppose, je n'ai pas écrit C++ depuis longtemps maintenant.

+0

J'ai essayé \ n, mais ça ne marchera pas. La seule façon de le faire fonctionner est d'utiliser fflush. – carlfilips

+0

Oui, car c'est le bon moyen de le faire :) – Shahor

0

De la page de manuel:

Note that output popen() streams are fully buffered by default. 

Cela signifie que pour une implémentation standard, entre 512 et 8192 octets devront être écrit avant que les données sont automatiquement vidée au descripteur de fichier sous-jacent.

Soit appeler fflush(), ou mieux encore, appelez setvbuf(fp, nullptr, _IONBF, 0);