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;

   }
¿Fue útil?

Solución

Sus printfs 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 utilizar strlen(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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top