我正在嘗試用 C 撰寫一個支持多管道行程處理的 shell,具體取決于用戶給出的單獨行程的數量,每個行程用“|”分隔 象征。shell 為每個行程將行程數量分叉到一個子行程中。
這是一個例子:
texto1.txt = "Isto é o Texto 1"
$ cat texto1.txt | grep -c Isto
結果:1
但是我在孩子之間以及最終與父行程之間的溝通方面遇到了麻煩。
這是我當前的execpipe函式代碼,它執行管道行程,argv1以及argv2用戶輸入給出的兩個獨立行程:(示例ls -l | wc -l:)
int execpipe(char ** argv1, char ** argv2)
{
int fds[2];
pipe(fds);
int i;
pid_t p1, p2;
p1 = fork();
if (p1 == -1)
{ // error
char * error = strerror(errno);
printf("error fork!!\n");
return 1;
}
if (p1 == 0)
{ // child process
close(fds[0]);
dup2(fds[1], STDOUT_FILENO);
close(fds[1]);
if(execvp(argv1[0], argv1)<0){ // run command AFTER pipe character in userinput
char * error = strerror(errno);
printf("unknown command\n");
return 0;
}
}
else
{ // parent process
p2 = fork();
if(p2==0){
close(fds[1]);
dup2(fds[0], STDIN_FILENO);
close(fds[0]);
if(execvp(argv2[0], argv2)<0){ // run command AFTER pipe character in userinput
char * error = strerror(errno);
printf("unknown command\n");
return 0;
}
}else{ //Parent waits for both of it's children
wait(NULL);
wait(NULL);
}
}
}
uj5u.com熱心網友回復:
父行程必須關閉管道的寫入端以指示第二個行程不再有資料到來:
}
}else{ //Parent waits for both of it's children
close(fds[1]); // add this line
wait(NULL);
wait(NULL);
}
小記:代替
char * error = strerror(errno);
printf("error fork!!\n");
為什么不
perror("fork");
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512841.html
標籤:Clinux壳管道叉子
上一篇:alpinelinuxash中的bashrc等價物是什么?
下一篇:生成兩個單詞的隨機序列
