Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * digenv.c
- * PipeLab
- *
- * Created by Lisan Chen and Tingting Shi on 11/10/10.
- * Copyright 2009 Kungliga Tekniska Högskolan (KTH). All rights reserved.
- *
- * Input - 0
- * Output - 1
- * Error -2
- */
- #include "unistd.h"
- #include "stdio.h"
- #include "stdlib.h"
- #include "sys/types.h"
- #include "sys/wait.h"
- int main(int argc, char **argv){
- /*
- * Skapar två fildeskriptorer p1 och p2, som pipas.
- */
- int p1[2];
- int p2[2];
- pipe(p1);
- pipe(p2);
- /*
- * Skapar en childprocess med fork(): pidchild.
- */
- pid_t pidchild;
- pidchild = fork();
- if(pidchild==0){
- /*
- * Den här koden körs endast i childprocessen.
- */
- close(p1[0]); /* Denna process läser inte från pipen, stäng läsänden */
- dup2(p1[1],1); /* Ersätter stdout med skrivänden av pipen */
- execlp("printenv", "printenv", NULL); /* Kör printenv */
- _exit(0); /* Avslutar childprocessen pidchild */
- }else if(pidchild==-1){
- /* Den här koden körs endast om fork() har misslyckats */
- perror("pidchild error\n");
- }else{
- /* Denna kod körs endast i parentprocessen */
- close(p1[1]); /* Denna process skriver inte till pipen, stäng skrivänden */
- dup2(p1[0],0); /* Ersätter stdin med läsänden av pipen */
- wait(&pidchild); /* Väntar på att childprocessen pidchild ska köra klart */
- /* Hit kommer vi endast om fork() har fungerat bra */
- /* En annan childprocess skapas med fork(): pidchild2 */
- pid_t pidchild2;
- pidchild2 = fork();
- /*
- * Denna delen av koden gör samma sak som koden ovan men
- * kör sort istället för printenv.
- */
- if(pidchild2 == 0){
- close(p2[0]);
- dup2(p2[1],1);
- if(argc>1){ /* Grep körs med angivet argument i argv endast om argc > 1 */
- execvp("grep", argv);
- }
- execlp("sort", "sort", NULL);
- _exit(0);
- }else if(pidchild2 == -1){
- perror("pidchild2 error\n");
- }else{
- close(p2[1]);
- dup2(p2[0], 0);
- wait(&pidchild2);
- /* Efter att printenv och sort (och grep) har kört klart, kör less */
- execlp("less", "less", NULL);
- _exit(0);
- }
- _exit(0);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement