Chaîne copie en utilisant des tuyaux
Question
J'ai écrit le code suivant pour copier une chaîne « Bonjour tout le monde » à un autre tableau de caractères en utilisant la fourche et des tuyaux au lieu d'utiliser les fonctions de la bibliothèque standard ou flux standard i / o. Le programme compile avec succès, mais je ne reçois aucune sortie. Même, ne sont pas montré la sortie du printf.
# include <string.h>
# include <unistd.h>
# include <stdio.h>
char string[] = "hello world";
int main()
{
int count, i;
int toPar[2], toChild[2];
char buf[256];
pipe(toPar);
pipe(toChild);
if (fork() == 0)
{
printf("\n--- child process ---");
close(0);
dup(toChild[0]);
close(1);
dup(toPar[1]);
close(toPar[1]);
close(toChild[0]);
close(toPar[0]);
close(toChild[1]);
for (;;)
{
if ((count = read(0, buf, sizeof(buf))) == 0)
break;
printf("\nChild buf: %s", buf);
write(1, buf, count);
}
}
printf("\n--- parent process ---");
close(1);
dup(toChild[1]);
close(0);
dup(toPar[0]);
close(toPar[1]);
close(toChild[0]);
close(toPar[0]);
close(toChild[1]);
for (i = 0; i < 15; i++)
{
write(1, string, strlen(string));
printf("\nParent buf: %s", buf);
read(0, buf, sizeof(buf));
}
return 0;
}
La solution
Vos printf
s sont en train d'écrire à stdout
- mais à la fois le parent et l'enfant, vous avez redirigé descripteur de fichier 1 à un tuyau, de sorte que c'est là la sortie printf
sera
Au lieu de printf(...)
, utilisez fprintf(stderr, ...)
-. Vous serez en mesure de voir la sortie, car stderr
pointe toujours vers votre terminal
Notez que vous avez quelques bugs:
- l'enfant doit appeler
_exit(0)
quand il est fait, sinon il tombera dans le code parent; - le
write
doit utiliserstrlen(string) + 1
, de sorte qu'il écrit le terminateur NUL.
Autres conseils
Essayez d'ajouter un "\ n", comme printf("\nParent buf: %s\n", buf);
Je suppose que ces tuyaux sont en train de faire le blocage IO, alors lu sera tout simplement pas revenir à moins que le tuyau est fermé par l'autre processus. Cela, et printf faire IO tampon, vous empêche d'obtenir une sortie.