簡體   English   中英

在 linux shell 模擬器中執行超過 2 個管道的麻煩 (c)

[英]trouble to exec more than 2 pipes in a linux shell simulator (c)

我正在嘗試制作 linux shell 模擬器,但是當輸入是具有超過 2 個管道的命令時,我遇到了麻煩。 這是我的代碼:

int Executa_Fork(char ***comando,int npipe){
    pid_t pid;
    int status,i,j;
    int **pipefd;
    
    pipefd = malloc(sizeof(int *)*(npipe));
    
    for(i = 0;i < npipe;i++){
        pipefd[i] = malloc(sizeof(int)*2);
    }
    
    for(i = 0;i <= npipe;i++){
        if(npipe != i){
            if (pipe(pipefd[i]) < 0) { 
                perror("pipe"); 
                exit(EXIT_FAILURE); 
                } 
        
        }
        
        pid = fork();
        if (pid < 0) {
            perror("fork");
            exit(EXIT_FAILURE);
        }
        
        if(pid == 0){ //processo filho
            printf("filho");
            if(i == 0){
                dup2(pipefd[i][1], 1);

                close(pipefd[i][0]);
                close(pipefd[i][1]);
            }else if(i != npipe){   
                dup2(pipefd[i-1][0], 0);

                dup2(pipefd[i][1], 1);

                close(pipefd[i][0]);
                close(pipefd[i][1]);
                close(pipefd[i-1][0]);
                close(pipefd[i-1][1]);

            }else{
                dup2(pipefd[i-1][0], 0);

                close(pipefd[i-1][0]);
                close(pipefd[i-1][1]);
            }
            printf("%s %s\n", comando[i][0], comando[i][1]);
            if(execv(comando[i][0],comando[i]) == -1){
                perror("exec");
                exit(EXIT_FAILURE);
            }
        }
    }
    return 1;

}

npipe 是 pipe 輸入的命令數,comando 存儲命令,comando[command index] 是要執行的命令。 如果有人可以幫助我找到執行超過 2 個管道命令的方法,我將不勝感激。

您的問題是,如果您有如下管道:

cmd1 | cmd2 | cmd3 | cmd4

(通過管道 P1、P2、P3 連接),然后在您處理cmd3時,父進程已打開 P1、P2 和 P3,子進程也是如此。 您的子代碼會小心關閉 P2 和 P3,但不會關閉 P1——您也需要關閉 P1。 並且您需要查看父進程對管道的作用; 它也應該關閉它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM