Mah ... non lo posso provare, ma scriverei qualcosa del genere ...

codice:
char c;
char *stringa = malloc(sizeof(char));
stringa[0]=0;
int i = 0;

dup2(p[0],0);
close(p[1]);
while( read(p[0],&c,sizeof(c) ) )
{
  i++;
  stringa = realloc(stringa, (i + 1) * sizeof(char));
  stringa[i-1]=c;
  stringa[i]=0;
}

printf("%s",stringa);