2014-11-06 77 views
0

我正在寫一個簡單的代碼來實現unix/linux外殼的管道功能。簡單的外殼與管道()函數

#include <sys/types.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

void 
cisshPipe(char* command1[], char* command2[]) 

{ 
    int fd[2];//create array for two file descritors 
    pid_t childPid;//To set for child process 
    pipe(fd);//To create pipeline here 

    if((childPid=fork())==-1) 
    { 
     perror("fork here"); 
     exit(1); 
    } 

//The below is the real meat for this subroutine 
    if(childPid==0)//If child process 
    { 
    close(fd[0]);//To close the input of child 
    dup(fd[0]);//To duplicate the input, for the later process 
    } 
    else//For the real output 
    { 
    close(fd[1]);//To close the parent output first 
    execvp(command2[],command2); 
    } 

    } 

但是,我在「execvp(command2 [],command2)」上得到了一些編譯錯誤,在這裏預期的表達式。我認爲這是由於我使用dup()函數將子輸出傳遞給父輸入。有任何建議來解決它嗎?

一些更新:

感謝您的答案約翰。我解決了編譯問題。但是當我輸入「ls | sort」時它正在執行管道功能,我認爲這仍然是dup()問題的傳遞。

+0

請張貼的確切消息。錯誤是什麼告訴你什麼是錯的... – clcto 2014-11-06 20:17:29

+0

謝謝你的回覆。現在修復它。 – 2014-11-06 20:21:21

+0

您是否閱讀過您要撥打的功能的文檔[execvp(3)](http://man7.org/linux/man-pages/man3/execvp.3.html)?您應該按照記錄調用它... – 2014-11-06 20:23:20

回答

1

此代碼有效,但不會執行所有可能的錯誤檢查。類似於在將標準輸入從(或標準輸出)重定向到文件後關閉文件描述符的方式,當您使用管道時,如果將管道的一端連接到標準輸入或輸出,則需要然後在執行命令之前關閉管道的兩端。當管道在父子流程中創建時,您需要確保父管道的兩端都已關閉。

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <unistd.h> 

static inline void error(const char *msg) 
{ 
    perror(msg); 
    exit(EXIT_FAILURE); 
} 

static void 
cisshPipe(char **command1, char **command2) 
{ 
    int fd[2]; 
    pid_t childPid; 
    if (pipe(fd) != 0) 
     error("failed to create pipe"); 

    if ((childPid = fork()) == -1) 
     error("failed to fork"); 

    if (childPid == 0) 
    { 
     dup2(fd[1], 1); 
     close(fd[0]); 
     close(fd[1]); 
     execvp(command1[0], command1); 
     error("failed to exec command 1"); 
    } 
    else 
    { 
     dup2(fd[0], 0); 
     close(fd[0]); 
     close(fd[1]); 
     execvp(command2[0], command2); 
     error("failed to exec command 2"); 
    } 
} 

int main(void) 
{ 
    char *ls[] = { "ls", 0 }; 
    char *sort[] = { "sort", "-r", 0 }; 
    cisshPipe(ls, sort); 
    return 0; 
} 

輸出示例:

xx.dSYM 
xx.c 
xx 
xma.dSYM 
xma.c 
xma 
ws-c11.c 
… 
am-pm.pl 
2dv.dSYM 
2dv.c 
2dv 
2da.dSYM 
2da.c 
2da 
+0

非常感謝您的回答。 – 2014-11-07 15:25:39

3
execvp(command2[],command2); 

空的[]是語法錯誤。也許你的意思是:

execvp(command2[0], command2);