copia de cadena usando tuberías
Pregunta
he escrito el siguiente código para copiar una cadena "hola mundo" a otra matriz de caracteres usando un tenedor y tuberías en lugar de utilizar las funciones de la biblioteca estándar o E / S flujos estándares. El programa está compilando con éxito, pero no estoy recibiendo ninguna salida. Incluso, no se están mostrando la salida del 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;
}
Solución
Sus printf
s están escribiendo a stdout
- pero en ambos el padre y el niño, que hemos redirigido descriptor de archivo 1 a un tubo, de modo que es donde la salida printf
irá
En lugar de printf(...)
, el uso fprintf(stderr, ...)
-. Continuación, podrás ver la salida, ya que stderr
todavía está apuntando a su terminal
Tenga en cuenta que usted tiene un par de errores:
- el niño debe llamar
_exit(0)
cuando se hace, de lo contrario se caerá en el código de los padres; - el
write
debe utilizarstrlen(string) + 1
, para que escriba el terminador nulo.
Otros consejos
Trate de añadir un "\ n", como printf("\nParent buf: %s\n", buf);
supongo que esos tubos están haciendo el bloqueo de IO, por lo que leo simplemente no volver a menos que el tubo está cerrado por el otro proceso. Eso, y haciendo tamponada IO printf, le impide conseguir cualquier salida.