title: Multiple tests with Pipes IPC between parent and child in C
body: <p>I am writing a program of Parented Process Communication with pipes, the point is that I need to send from an endline different amounts of data (large ones) but I don't know how to ordered 'split' the message into smaller ones (4096 Bytes each one) and send them in order to the read endline. I've tried with a cycle that makes (message size / 4096) iterations but it didn't work so I let that idea away.</p>
  <p>Here is my code:</p>
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;sys/types.h&gt;
  #include &lt;string.h&gt;
  #include &lt;fcntl.h&gt;
  #include &lt;time.h&gt;
  
  #define SIZES 6
  #define KB 1024
  
  //1KB, 10KB, 100KB, 1MB, 10MB, 100MB
  int PACK_SIZES[SIZES] = {1*KB, 10*KB, 100*KB, 1*KB*KB, 10*KB*KB, 100*KB*KB};
  //int PACK_TESTS[SIZES] = {1000,1000,100,100,10,5};
  int PACK_TESTS[SIZES] = {6,5,4,3,2,1};
  
  void fill(char * bufptr, size_t size);
  
  int main() {
      int tests_amount;
      size_t size;
      
      //pipefd[0] -&gt; lectura
      //pipefd[1] -&gt; escritura
      int pipefd[2];
  
      int r;  //Variable de retorno.
      pid_t pid;
  
      r = pipe(pipefd);
      if (r &lt; 0){
          perror(&quot;Error al crear la tubería&quot;);
          exit(-1);
      }
  
      printf(&quot;Medidas de envío de paquetes con comunicación mediante Tuberías.\n\n&quot;);
  
      pid = fork();
      if (pid == (pid_t) -1){
          perror(&quot;Error en fork&quot;);
          exit(-1);
      }
  
      for (int i = 0; i &lt; SIZES; i++){
          int packages_amount;
          tests_amount = PACK_TESTS[i];
          size = PACK_SIZES[i];
  
          float time0, time1;
          float total_time = 0;
  
          char *write_buffer[size];
          char *read_buffer[size];
          fill(write_buffer, size);
  
          for (int j = 1; j &lt;= tests_amount; j++){
              time0 = clock();
  
              if (pid == 0){
                  //Consumidor
  
                  close(pipefd[1]);
                  read(pipefd[0], read_buffer, size);
                  close(pipefd[0]);
                  //printf(&quot;\n Mensaje recibido de tamaño %d: %d \n&quot;, size, strlen(read_buffer));
  
              }else {
                  //Productor
                  close(pipefd[0]);
                  write(pipefd[1], write_buffer, size);
                  close(pipefd[1]);
              }
              time1 = clock();
              double tiempo = (double)(time1) / CLOCKS_PER_SEC-(double)(time0) / CLOCKS_PER_SEC;
              total_time = total_time + tiempo;
          }
  
          printf(&quot;El promedio con %d Bytes y %d pruebas es: %f seg. \n\n&quot;,size,tests_amount,total_time/tests_amount);
          total_time = 0;
  
      }
      return 0;
  }
  
  void fill(char * bufptr, size_t size){
      static char ch = 'A';
      int filled_count;
  
      //printf(&quot;size is %d\n&quot;, size);
      if (size != 0){
          memset(bufptr, ch, size);
      } else {
          memset(bufptr, 'q', size);
      }
      
      bufptr[size-1] = '\0';
      
      if (ch &gt; 90)
          ch = 65;
      
      filled_count = strlen(bufptr);
  
      //printf(&quot;Bytes escritos: %d\n\n&quot;, filled_count);
      //printf(&quot;buffer filled is:%s\n&quot;, bufptr);
      ch++;
  }
  </code></pre>
  <p>I get something like the following error (I know it's race conditioned but I don't know how to fix it :c):</p>
  <pre><code>Medidas de envío de paquetes con comunicación mediante Tuberías.
  
  El promedio con 1024 Bytes y 6 pruebas es: 0.000002 seg. 
  
  
   Mensaje recibido de tamaño 1024: 1023 
  
   Mensaje recibido de tamaño 1024: 1023 
  
   Mensaje recibido de tamaño 1024: 1023 
  
   Mensaje recibido de tamaño 1024: 1023 
  
   Mensaje recibido de tamaño 1024: 1023 
  
   Mensaje recibido de tamaño 1024: 1023 
  El promedio con 10240 Bytes y 5 pruebas es: 0.000001 seg. 
  
  El promedio con 1024 Bytes y 6 pruebas es: 0.000012 seg. 
  
  
   Mensaje recibido de tamaño 10240: 0 
  
   Mensaje recibido de tamaño 10240: 0 
  
   Mensaje recibido de tamaño 10240: 0 
  
   Mensaje recibido de tamaño 10240: 0 
  
   Mensaje recibido de tamaño 10240: 0 
  El promedio con 10240 Bytes y 5 pruebas es: 0.000005 seg. 
  
  El promedio con 102400 Bytes y 4 pruebas es: 0.000001 seg. 
  
  
   Mensaje recibido de tamaño 102400: 0 
  
   Mensaje recibido de tamaño 102400: 0 
  
   Mensaje recibido de tamaño 102400: 0 
  
   Mensaje recibido de tamaño 102400: 0 
  El promedio con 102400 Bytes y 4 pruebas es: 0.000008 seg. 
  
  Segmentation fault (core dumped)
  </code></pre>