C Program Pipes Exercise

How to write a C Program for Pipes Exercise in C Programming Language ?


Solution:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <unistd.h>
  5.  
  6. int main(int argc, char **argv)
  7. {
  8.         int n;
  9.         int i, pid, sum = 0;
  10.         int fd[2];
  11.  
  12.         if( (argc != 2) || (sscanf(argv[1],"%d",&n) != 1) )
  13.         {
  14.                 fprintf(stderr, "I need just one parameter and that's a number\n");
  15.                 exit(1);
  16.         }
  17.  
  18.  
  19.         if(pipe(fd))
  20.         {
  21.                 // pipe != 0 -> something went wrong
  22.                 fprintf(stderr, "\nI am not a plumber, I am not able to make a pipe\n");
  23.                 exit(1);
  24.         }
  25.  
  26.         // set stdout buf to null to get ordered output
  27.         setbuf(stdout, NULL);
  28.        
  29.         // make n children
  30.         for(= 0 ; i<; i++)
  31.         {
  32.                 // i-th child
  33.                 if((pid=fork()) == 0)
  34.                 {
  35.                         // I'm not reading anything,
  36.                         // so close the read side of the pipe
  37.                         close(fd[0]);
  38.                        
  39.                         // compute the power
  40.                         n = pow(2, i);
  41.                         printf("I'm %d computing 2^%d = %d\n", i , i , n);
  42.                        
  43.                         write(fd[1], &n, sizeof(int));
  44.                        
  45.                         // close the pipe on the write side,
  46.                         // so the parent will get -1 when non more data are available
  47.                         // and the write side of the pipe has been closed by all children
  48.                         close(fd[1]);
  49.                         exit(0);
  50.                 }
  51.                 // something went wrong
  52.                 else if(pid < 0)
  53.                 {
  54.                         fprintf(stderr, "I am sterile, I can't have children\n");
  55.                         exit(1);
  56.                 }
  57.         }
  58.  
  59.         // the parent closes the write side of the pipe
  60.         close(fd[1]);
  61.        
  62.         while(read(fd[0], &i, sizeof(int) )>0)
  63.         {
  64.                 printf("SUM: %d\tValue: %d\n", sum, i);
  65.                 sum+=i;
  66.         }
  67.  
  68.         // finally it closes the other side too
  69.         close(fd[0]);
  70.  
  71.         printf("\n%d\n", sum);
  72.  
  73.         return 0;
  74. }


Learn More :