be se la popen fa quello che dice...in teoria non crei nessun file (in pratica usi le pipe). Quindi
per mandare al client l'output di ls il server dovrebbe usare un codice del genere:
codice:
  FILE *tmp_out = popen("ls -l", "r");
  if( !tmp_out )
     exit(1);
  char tmp_buff[1024];
  int tmp_r;
  while( (tmp_r = fread(tmp_out, tmp_buff, sizeof(tmp_buff))) != 0 )
  {
     invio al client i primi tmp_r caratteri di tmp_buff
  }
  pclose(tmp_out);
Ho scritto senza provare quindi ci sono molte probabilità che ho frainteso qualcosa (in particolare ho assunto che la fread torni 0 quando ls è terminato). Comunque con un po' di prove si dovrebbe riuscire a farlo funzionare.
Ripeto: se ho ben capito viene creata una pipe e non un file su disco (difatti inizialmente volevo vedere se si poteva cambiare gli handle dei file stdout e stdin per l'ls poi ho visto che esisteva una funzione che faceva tutto questo).

Buone prove (e fammi sapere se funziona)