popen("grep ps","w") 이것 이상합니다. 기다리기 싫을 텐데..

dltkddyd의 이미지

#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <cstring>
int main() {
  char rbuffer[1024];
  FILE* pipefp1=popen("ps -l","r");
  FILE* pipefp2=popen("grep ps","w");
  while(fgets(rbuffer,1024,pipefp1)!=0) {
    fputs(rbuffer,pipefp2);
    fputs(rbuffer,pipefp2);
  }
  pclose(pipefp1);
  pclose(pipefp2);
  return 0;
}

위와 같은 코드에서 pipefp1이 있는 행의 popen을 알겠는데, 그 아래 행이 이해되지 않습니다.

FILE* pipefp2=popen("grep ps","w");

에서 grep ps는 이미 자식프로세스에서 실행된 것 아닌가요? 그렇데 while블록 안의 두 번째 fputs에서 입력을 받아 실행이 됩니다. w인 경우 자식프로세스는 입력을 받을 때까지 대기하는 것인가요? r일 경우는 대기하지 않는 것 같은데요.