Rediriger processus enfant stdin et stdout pour les tuyaux


EDIT:
La solution est

 int c1=dup2(pipes[0][1],STDOUT_FILENO);
 int c2=dup2(pipes[1][0],STDIN_FILENO);


 setvbuf(stdout,NULL,_IONBF,0);

Il est SETVBUF pour définir la sortie standard de la non-mise en mémoire tampon. Même si j'ai l'impression que le caractère de saut de ligne si la destination n'est pas un écran, je suppose que, il devient une mémoire tampon.



EDIT:
Quand j'ai mis fflush(stdout) après la LIGNE 1 et fflush(fout) après la LIGNE 4, il fonctionne comme prévu. Toutefois, il ne fonctionne pas sans le fflush(stdout) après la LIGNE 1. Le problème est que je ne voudrais pas être en mesure de mettre fflush dans le programme que j'ai l'intention d'exécuter.


Je suis en train de démarrer un autre programme à partir de mon processus. Je n'ai pas accès à son code mais je sais qu'il utilise stdin et stdout pour l'interaction de l'utilisateur. Je suis en train de démarrer ce programme par la création de 2 tuyaux, de la fourche-ing et de rediriger l'enfant stdin/stdout à la bonne extrémités des tuyaux. Les points, c'est que le parent doit être en mesure de communiquer avec l'enfant via des descripteurs de fichiers, tandis que son stdin/stdout doit être intact. Le POPEN syscall ne s'ouvre unidirectionnel pipe. Le code suivant fonctionne presque.

Il y a 4 lignes comme la LIGNE 1..4.

La LIGNE 1 est l'enfant de l'envoi à la pipe,
La LIGNE 2 est l'enfant de la réception de la conduite,
La LIGNE 3 est le parent de l'envoi à la pipe,
La LIGNE 4 est parent de la réception de la conduite,

C'est juste un jouet exemple pour s'assurer que les choses fonctionnent. Le problème est que c'est tous les 4 lignes LIGNE 1..4 sont décommenté la sortie je vois sur le terminal est

PARENT1: -1
FD: 1 0    4 5    0 1
DEBUG1: 0
DEBUG2: 0

Alors que si la LIGNE 1 et la LIGNE 3 sont sans commentaire je suis seule à voir un flux continu de données. Même si, si seulement la LIGNE 2 et la LIGNE 4 sont sans commentaire. Cependant, j'ai une communication bidirectionnelle. Ajouter également le commentaire de SOMMEIL ne change pas le comportement.

Ce qui pourrait être question ici. Je me demande pourquoi il n'est pas bidirectionnelle POPEN.

int pid;
int pipes[2][2];
pipe(pipes[0]);
pipe(pipes[1]);
pid=fork();
if(pid==0)
{
//usleep(1000000);
close(pipes[0][0]);
close(pipes[1][1]);
int c1=dup2(pipes[0][1],STDOUT_FILENO);
int c2=dup2(pipes[1][0],STDIN_FILENO);
//int c2=dup2(STDIN_FILENO,pipes[1][0]);
fprintf(stderr,"FD: %d %d    %d %d    %d %d\n",c1,c2,pipes[0][1],pipes[1][0],STDIN_FILENO,STDOUT_FILENO);
//FILE*fout=fdopen(pipes[0][1],"w");
//FILE*fin =fdopen(pipes[1][0],"r");
while(1)
{
static int c1=0;
fprintf(stderr,"DEBUG1: %d\n",c1);
printf("%d\n",c1);                      //LINE 1
fprintf(stderr,"DEBUG2: %d\n",c1);
scanf("%d",&c1);                        //LINE 2
fprintf(stderr,"DEBUG3: %d\n",c1);
c1++;
}
//fclose(fout);
//fclose(fin);
return 0;
}
close(pipes[0][1]);
close(pipes[1][0]);
char buffer[100];
FILE*fin=fdopen(pipes[0][0],"r");
FILE*fout=fdopen(pipes[1][1],"w");
while(1)
{
int c1=-1;
printf("PARENT1: %d\n",c1);
fscanf(fin,"%d",&c1);                         //LINE 3
printf("Recv: %d\n",c1);
fprintf(fout,"%d\n",c1+1);                    //LINE 4
printf("PARENT3: %d\n",c1+1);
}
fclose(fin);
fclose(fout);
  • Il est normal de répondre à votre propre question! Au lieu de modifier l'original de la question avec votre solution, vous devriez poster une réponse, et il faut l'accepter.
InformationsquelleAutor user1068779 | 2013-07-18