J'ai un processus parent et enfant, et le parent peut lire la sortie de l'enfant et l'envoyer à l'entrée de l'enfant. Jusqu'à présent, tout fonctionne correctement avec les scripts shell, testant les commandes qui entrent et sortent les données. Je viens de tester avec un simple programme C et je n'arrivais pas à le faire fonctionner. Voici le programme C:sélectionner échouer avec le programme C mais pas le shell
#include <stdio.h>
int main(void) {
char stuff[80];
printf("Enter some stuff:\n");
scanf("%s", stuff);
return 0;
}
Le problème avec le programme C est que mon select ne parvient pas à lire la fd des enfants et par conséquent le programme ne peut pas finir. Voici le bit qui fait la sélection ..
//wait till child is ready
fd_set set;
struct timeval timeout;
FD_ZERO(&set); // initialize fd set
FD_SET(PARENT_READ, &set); // add child in to set
timeout.tv_sec = 3;
timeout.tv_usec = 0;
int r = select(FD_SETSIZE, &set, NULL, NULL, &timeout);
if(r < 1) { // we didn't get any input
exit(1);
}
Est-ce que quelqu'un a une idée pourquoi cela se passerait-il avec le programme C et non une coquille?
Éditer: Je dois préciser que le processus fils appelle exec sur un argument, donc je n'y ai pas accès après ce point.
Bon rappel re 'setvbuf'; J'espère que cela ne vous dérange pas d'incorporer la suggestion. –
@Charles: Il y avait une période d'environ 5 ans quand c'était une question standard chez les nouveaux arrivants à la communauté Tcl ("pourquoi mon sous-processus ne fonctionne pas ?!") et ma réponse est la distillation de ce que nous avons dit leur. (Eh bien, utiliser la version complète d'Expect est la vraie solution que nous préférions à l'époque, mais cela ne va pas répondre à cette question.) –
Le processus fils utilise exec, donc fflush() n'est pas vraiment une option. J'ai essayé d'utiliser setvbuf (stdout, (char *) NULL, _IONBF, 0); sur l'enfant avant l'exécutif, mais cela ne semblait pas fonctionner. Avez-vous une idée pourquoi? – Gary