Frage

Ich habe den folgenden Code geschrieben, um eine Zeichenfolge „Hallo Welt“ auf einem anderen char-Array kopieren mit Gabel und Rohren anstelle von Standard-Bibliotheksfunktionen oder Standard-I / O-Streams. Das Programm kompiliert erfolgreich, aber ich bin keine Ausgabe zu bekommen. Auch ist die Ausgabe des printf nicht gezeigt wird.

# 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;

   }
War es hilfreich?

Lösung

Ihre printfs zu stdout schreiben -. Aber sowohl in den Eltern und Kind, haben Sie Dateideskriptor 1 zu einem Rohr umgeleitet, so dass die, wo der printf Ausgang gehen

Statt printf(...), Verwendung fprintf(stderr, ...) -. Dann werden Sie in der Lage sein, die Ausgabe zu sehen, da stderr noch zu Ihrem Terminal zeigen

Beachten Sie, dass Sie ein paar Fehler haben:

  • sollte das Kind _exit(0) nennen, wenn es fertig ist, sonst wird es den übergeordneten Code fällt in;
  • die write sollte strlen(string) + 1 verwenden, so dass es den nul Terminator schreibt.

Andere Tipps

Versuchen Sie, ein "\ n", wie printf("\nParent buf: %s\n", buf);

Ich würde vermuten, dass diese Rohre tun IO blockiert, so lesen einfach nicht zurück, wenn das Rohr durch das andere Verfahren ist geschlossen. Das, und printf IO gepuffert dabei verhindert, dass Sie keine Ausgabe zu bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top