copia String utilizzando tubi
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;
}
Soluzione
I tuoi printf
s 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 usarestrlen(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.