1 #include <unistd.h>
  2 #include <stdlib.h>
  3 #include <stdio.h>
  4 
  5 int main(int argc, char** argv) {
  6 
  7    int fds[2];
  8 
  9    pipe(fds);
 10 
 11    if(!fork()) { //child
 12       close(fds[0]);
 13       dup2(fds[1] /*write descritor*/, 1 /*stdout*/);
 14       execlp("ls", "ls", NULL);
 15    } else {
 16      close(fds[1]);
 17      dup2(fds[0], 0);
 18      execlp("wc", "wc", "-l", NULL);
 19    }
 20    return 0;
 21 }

Pytanie:
Dlaczego w linijce 16 jeżeli close zostanie zakomentowane to program nie działa ? Wydawało mi się, że ten close jest dla "estetyki i poprawności", a jednak program się nie kończy i "wisi" gdy jest ta linijka zakomentowana. Gdy ją odkomentuję to program działa poprawnie tzn, jak zestaw poleceń ls | wc -l. Zechciał by ktoś wyjaśnić mi skąd takie zachowanie ?