2016-01-24 68 views
1

我瞭解管道要運行的命令,如ls -l | wc -l:輸入重定向和管道

int pipes[2]; 
pipe(pipes); 

if (fork() == 0){ //first fork 
    dup2(pipes[1],1); 
    close(pipes[0]); 
    close(pipes[1]); 

    execvp(arr1[0], arr1); //arr1[0] = "ls" and arr1[1] = "-l" and arr1[2] = 0 
    perror("Ex failed"); 
    exit(1); 
} 

if (fork() == 0){ //2nd fork 
    close(pipes[1]); 
    dup2(pipes[0],0); 
    close(pipes[0]); 

    execvp(arr2[0], arr2); //arr2[0] = "wc" and arr2[1] = "-l" and arr2[2] = 0 
    perror("Ex failed"); 
    exit(1); 
} 

但是,如何包含輸入和輸出重定向?可以說我想貓< foo.txt | wc -l

我知道第一個fork需要修改,但我不明白需要什麼(另一個dup2()?)。我將不勝感激一些幫助。

謝謝。

+0

你希望用'dup2(pipes [1],[1])完成什麼?這是無效的語法;我認爲你的意思是'dup2(管道[1],STDOUT_FILENO);'? –

+0

這是一個錯字。我會解決它。 – user5832523

回答

0

但是,如何包含輸入和輸出重定向?可以說我 想要貓< foo.txt | wc -l

在輸入重定向的情況下,打開文件進行讀取,然後使用dup2(2)將文件描述符複製到標準輸入中。文件描述符stdinSTDIN_FILENO,在unistd.h中定義。所以,這樣的事情:

#include <unistd.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 

// ... 

filename = "foo.txt"; 
int fd; 
if ((fd = open(filename, O_RDONLY)) == -1) { 
    perror("open %s: %s\n", filename, strerror(errno)); 
    exit(EXIT_FAILURE); 
} 
if (dup2(fd, STDIN_FILENO) == -1) { 
    perror("dup2: %s -> stdin: %s\n", filename, strerror(errno)); 
    exit(EXIT_FAILURE); 
} 
if (close(fd) == -1) { 
    perror("close %s: %s\n", filename, strerror(errno)); 
    exit(EXIT_FAILURE); 
} 

// Now, reading from stdin will read from the file. 
// Do the normal pipe operations here. 

int pipes[2]; 
// ... 

請注意,您的代碼沒有錯誤處理 - 沒有一個 - 這是非常糟糕的,因爲出問題的時候,你會忽視它的代碼將在神祕的方式崩潰。幾乎每個你調用的函數都會返回一個錯誤;考慮處理錯誤,以清楚地向用戶展示哪裏出了什麼問題。

+0

這似乎並不奏效。我完全按照你的建議做了。打開(),dup2()並關閉,然後我的兩個叉子保持不變。叉中是否需要額外的代碼? – user5832523

+0

@ user5832523分叉的代碼應該保持不變。請發佈您聲稱無法使用的完整工作,可編譯的代碼。 –