So I have 2 questions about pipes in c :
1:
When i fork a process after creating a pipe in order to make the parent write to the pipe and the child read from it, How it's synchronized ? : the parent always send data before the child attempts to read that data although they are running concurrently? why i don't fall on the case where the child start reading before the parent try to send its data ?
2:
This is about file descriptors of the pipe, referring to the code below how can parent-process close the pipe-output file-descriptor while the child doesn't access to that file yet ? , assuming the parent starts first.
Any help will be appreciated, Thank you !
#include <stdio.h>                                                                                 
#include <stdlib.h>                                                             
#include <unistd.h>                                                             
#include <sys/wait.h>                                                            
#include <stdlib.h>
#define BUFFER_SIZE  256
int main(int argc , char*argv[])
{
pid_t  worker_pid ;
int descriptor[2];
unsigned char bufferR[256] , bufferW[256];
/***************************** create pipe ********************/
puts("pipe creation");
if (pipe(descriptor) !=0)
    {
        fprintf(stderr,"error in the pipe");
        exit(1);
    }
/***************************** create processes ********************/
puts("now fork processes");
worker_pid = fork(); // fork process 
if (worker_pid == -1 ) // error forking processes
    {
        fprintf(stderr,"error in fork");
        exit(2);
    }
/*********************** communicate processes ********************/
if (worker_pid == 0) // in the child process :  the reader
    {
     close(descriptor[1]); // close input file descriptor , ok because parent finished writing
     read(descriptor[0],bufferR,BUFFER_SIZE);
     printf("i'm the child process and i read : %s \n",bufferR);
    }
if (worker_pid !=0)
    {
       // is there any case where child attempts to read before parent writting ?
       close(descriptor[0]);// close file descriptor of child before it reads ?
       sprintf(bufferW,"i'm the parent process my id is %d , and i wrote this to my child",getpid());
       write(descriptor[1],bufferW,BUFFER_SIZE);
       wait(NULL); 
    }
    return 0;
}
I expected there will be some cases for question 1 where the output is   :
i'm the child process and i read :
because the parent doesn't wrote it's message yet
for question 2 i expected an error saying :
invalid file descriptor in the child process because the parent already closed it (assuming the parent runs always the first)
but the actual output is always : 
i'm the child process and i read: i'm the parent process my id is 7589, and i wrote this to my child