Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.17 KB | None | 0 0
  1. /*
  2.  *  digenv.c
  3.  *  PipeLab
  4.  *
  5.  *  Created by Lisan Chen and Tingting Shi on 11/10/10.
  6.  *  Copyright 2009 Kungliga Tekniska Högskolan (KTH). All rights reserved.
  7.  *
  8.  * Input - 0
  9.  * Output - 1
  10.  * Error -2
  11.  */
  12.  
  13. #include "unistd.h"
  14. #include "stdio.h"
  15. #include "stdlib.h"
  16. #include "sys/types.h"
  17. #include "sys/wait.h"
  18.  
  19. int main(int argc, char **argv){
  20.    
  21.     /*
  22.      * Skapar två fildeskriptorer p1 och p2, som pipas.
  23.      */
  24.     int p1[2];
  25.     int p2[2];
  26.     pipe(p1);
  27.     pipe(p2);
  28.    
  29.     /*
  30.      * Skapar en childprocess med fork(): pidchild.
  31.      */
  32.     pid_t pidchild;
  33.     pidchild = fork();
  34.    
  35.     if(pidchild==0){
  36.        
  37.         /*
  38.          * Den här koden körs endast i childprocessen.
  39.          */
  40.        
  41.         close(p1[0]); /* Denna process läser inte från pipen, stäng läsänden */
  42.         dup2(p1[1],1); /* Ersätter stdout med skrivänden av pipen */
  43.        
  44.         execlp("printenv", "printenv", NULL); /* Kör printenv */
  45.        
  46.         _exit(0); /* Avslutar childprocessen pidchild */
  47.        
  48.     }else if(pidchild==-1){
  49.         /* Den här koden körs endast om fork() har misslyckats */
  50.         perror("pidchild error\n");
  51.     }else{
  52.        
  53.         /* Denna kod körs endast i parentprocessen */
  54.        
  55.         close(p1[1]); /* Denna process skriver inte till pipen, stäng skrivänden */
  56.         dup2(p1[0],0); /* Ersätter stdin med läsänden av pipen */
  57.         wait(&pidchild); /* Väntar på att childprocessen pidchild ska köra klart */
  58.        
  59.         /* Hit kommer vi endast om fork() har fungerat bra */  
  60.        
  61.         /* En annan childprocess skapas med fork(): pidchild2 */
  62.         pid_t pidchild2;
  63.         pidchild2 = fork();
  64.        
  65.         /*
  66.          * Denna delen av koden gör samma sak som koden ovan men
  67.          * kör sort istället för printenv.
  68.          */
  69.         if(pidchild2 == 0){
  70.            
  71.             close(p2[0]);
  72.             dup2(p2[1],1);
  73.            
  74.             if(argc>1){ /* Grep körs med angivet argument i argv endast om argc > 1 */
  75.                 execvp("grep", argv);
  76.             }
  77.            
  78.             execlp("sort", "sort", NULL);
  79.            
  80.             _exit(0);
  81.            
  82.         }else if(pidchild2 == -1){
  83.             perror("pidchild2 error\n");
  84.         }else{
  85.            
  86.             close(p2[1]);
  87.             dup2(p2[0], 0);
  88.             wait(&pidchild2);
  89.            
  90.             /* Efter att printenv och sort (och grep) har kört klart, kör less */
  91.             execlp("less", "less", NULL);
  92.             _exit(0);
  93.         }
  94.        
  95.         _exit(0);
  96.        
  97.     }
  98.    
  99.     return 0;
  100.    
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement