這是我爲我自己的shell找到的代碼。它工作正常,但我不明白的是代碼的管段。無法理解我自己的shell中的管道()
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
char* cmndtkn[256];
char buffer[256];
char* path=NULL;
char pwd[128];
int main(){
//setting path variable
char *env;
env=getenv("PATH");
putenv(env);
system("clear");
printf("\t MY OWN SHELL !!!!!!!!!!\n ");
printf("_______________________________________\n\n");
while(1){
fflush(stdin);
getcwd(pwd,128);
printf("[MOSH~%s]$",pwd);
fgets(buffer,sizeof(buffer),stdin);
buffer[sizeof(buffer)-1] = '\0';
//tokenize the input command line
char* tkn = strtok(buffer," \t\n");
int i=0;
int indictr=0;
// loop for every part of the command
while(tkn!=NULL)
{
if(strcoll(tkn,"exit")==0){
exit(0);
}
else if(strcoll(buffer,"cd")==0){
path = buffer;
chdir(path+=3);
}
else if(strcoll(tkn,"|")==0){
indictr=i;
}
cmndtkn[i++] = tkn;
tkn = strtok(NULL," \t\n");
}cmndtkn[i]='\0';
// execute when command has pipe. when | command is found indictr is greater than 0.
if(indictr>0){
char* leftcmnd[indictr+1];
char* rightcmnd[i-indictr];
int a,b;
for(b=0;b<indictr;b++)
leftcmnd[b]=cmndtkn[b];
leftcmnd[indictr]=NULL;
for(a=0;a<i-indictr-1;a++)
rightcmnd[a]=cmndtkn[a+indictr+1];
rightcmnd[i-indictr]=NULL;
if(!fork())
{
fflush(stdout);
int pfds[2];
pipe(pfds);
if(!fork()){
close(1);
dup(pfds[1]);
close(pfds[0]);
execvp(leftcmnd[0],leftcmnd);
}
else{
close(0);
dup(pfds[0]);
close(pfds[1]);
execvp(rightcmnd[0],rightcmnd);
}
}else
wait(NULL);
//command not include pipe
}else{
if(!fork()){
fflush(stdout);
execvp(cmndtkn[0],cmndtkn);
}else
wait(NULL);
}
}
}
什麼是呼叫的目的,關閉()爲0的參數和1意味着又是什麼調用DUP()呢?
[從這裏容易教程]得到一些(http://www.ccse.kfupm.edu.sa/~akbar/ICS431_031/LabExercises/Exercises.html) – 2013-05-14 07:34:13
@ user315052 @xaxxon我在理解'cd'部分時也有問題。我不明白爲什麼它將緩衝區分配給'chdir(path + = 3)'的路徑和代碼段。有人可以請解釋它.. – 2013-05-14 18:23:26
@VirajLakshitha:你不能像這樣繼續擴大你的問題的範圍。如果您必須提出一個新問題,但下次更努力證明您已嘗試自己回答問題。否則,這不是一個真正的問題,而是要求某人爲你做功課。 – jxh 2013-05-15 05:38:03