Domanda

ho scritto il seguente codice per copiare una stringa "ciao mondo" ad un altro array di caratteri usando forchetta e tubi invece di usare funzioni di libreria standard o flussi di I / O standard. Il programma sta compilando con successo ma non ricevo alcun output. Anche, non vengono visualizzati uscita 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;

   }
È stato utile?

Soluzione

I tuoi printfs stanno scrivendo a stdout - ma sia nel genitore e figlio, che hai reindirizzato descrittore di file 1 ad un tubo, così che è dove l'uscita printf andrà

.

Invece di printf(...), uso fprintf(stderr, ...) -. Allora sarete in grado di vedere l'uscita, in quanto stderr fa ancora riferimento al terminale

Si noti che si dispone di un paio di bug:

  • il bambino dovrebbe chiamare _exit(0) quando è fatto, altrimenti cadrà nel codice controllante;
  • il write dovrebbe usare strlen(string) + 1, in modo che scrive il terminatore nul.

Altri suggerimenti

Prova ad aggiungere un "\ n", come printf("\nParent buf: %s\n", buf);

Direi che quei tubi stanno facendo il blocco IO, in modo da leggere semplicemente non tornare a meno che il tubo si chiude con l'altro processo. Questo, e printf facendo tamponata IO, vi impedisce di ottenere alcun output.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top