无名管道的文件描述符关闭与标准输入输出

int main(void)
{
pid_t pid;
int fd[2];
char buf[100];

        //创建无名管道
        if(pipe(fd) < 0){
            perror("pipe");
            exit(1);
        }

        //创建子进程
        if((pid = fork()) < 0){
            perror("fork");
            exit(1);
        }else if(!pid){  //子进程向管道中写字符串
            while(1){
                bzero(buf,sizeof(buf));
                printf("请输入一个字符串:");
                fgets(buf,sizeof(buf),stdin);
                buf[strlen(buf)-1] = '\0';
                if(write(fd[1],buf,strlen(buf)) < 0){
                    perror("write");
                    exit(1);
                }
                if(!strncmp(buf,"quit",4))
                    break;
            }
            exit(0);
        }else{  //父进程从管道读数据,并打印到屏幕
            while(1){
                bzero(buf,sizeof(buf));
                if(read(fd[0],buf,sizeof(buf)) < 0){
                    perror("read");
                    exit(1);
                }
                if(!strncmp(buf,"quit",4))
                    break;
                printf("parent:%s\n",buf);
            }
            exit(0);
        }

        return 0;
    }

int main(void)
{
pid_t pid;
int fd[2];

if(pipe(fd)<0){
    perror("pipe");
    exit(1);
}

if((pid = fork())<0){
    perror("fork");
    exit(1);
}else if(!pid){
    close(fd[0]);
    dup2(fd[1],STDOUT_FILENO);
    execlp("ls","ls","-l",NULL);
    exit(0);
    
}else{
    close(fd[1]);
    dup2(fd[0],STDIN_FILENO);
    execlp("grep","grep","ls_w.c",NULL);
    exit(0);
    
}    
return 0;

}

第一个为什么不用关闭文件描述符?
第二个的dup2(fd[1],STDOUT_FILENO),写是输出,为什么不是输入