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;

   }
Était-ce utile?

La solution

Vos printfs 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 utiliser strlen(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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top