2010-09-04 15 views

cevap

2

pipe(2,3p) da kullanırsınız. Boruyu, çatalı oluşturun, borunun uygun ucunu Çocuğun FD 0 veya FD 1'ine kopyalayın, daha sonra yürütün.

25

İlk iki komutla küçük bir örnek. Ls ve grep ile grep ve daha fazlası arasındaki diğer boru arasında gidip gelecek boru() fonksiyonu ile bir boru oluşturmanız gerekir. Dup2'nin ne yaptığı bir dosya tanıtıcısını diğerine kopyalamaktır. Boru, girişi fd [0] 'da fd [1] çıkışına bağlayarak çalışır. Borunun ve dup2'nin man sayfalarını okumalısın. Başka şüpheleriniz varsa, örneği daha sonra deneyebilir ve basitleştirebilirim.

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

#define READ_END 0 
#define WRITE_END 1 

int 
main(int argc, char* argv[]) 
{ 
    pid_t pid; 
    int fd[2]; 

    pipe(fd); 
    pid = fork(); 

    if(pid==0) 
    { 
     printf("i'm the child used for ls \n"); 
     dup2(fd[WRITE_END], STDOUT_FILENO); 
     close(fd[WRITE_END]); 
     execlp("ls", "ls", "-al", NULL); 
    } 
    else 
    { 
     pid=fork(); 

     if(pid==0) 
     { 
      printf("i'm in the second child, which will be used to run grep\n"); 
      dup2(fd[READ_END], STDIN_FILENO); 
      close(fd[READ_END]); 
      execlp("grep", "grep", "alpha",NULL); 
     } 
    } 

    return 0; 
} 
+0

sadece bir çatal() kullanarak ve ls veya grep biri için özgün işlem kullanılarak, ama iyi bunu size bırakacağım tarafından geliştirilebilir: P – theprole

+0

nasıl sunmalıyız boru grep'in çıktısı daha fazla. Sadece iki süreci doğru mu? – CanCeylan

+1

grep için WRITE_END ile ls (READ_END) işlemini kapatmanız gerekir (yaptığınız şeyin tersi)? –