[英]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.