【发布时间】:2013-12-25 19:13:36
【问题描述】:
我正在设计一个简单的 shell,但我遇到了高级重定向问题。
我可以这样做:ls -al > a.txt
但我不能这样做:wc b.txt
我该怎么做?
这是我执行 i/o 重定向的地方:
char *inpu=NULL; //Inpu is a global variable.
#define CREATE_FLAGS (O_WRONLY | O_CREAT | O_TRUNC)
#define CREATE_FLAGS1 (O_WRONLY | O_CREAT | O_APPEND)
#define CREATE_FLAGS2 (O_RDONLY | O_CREAT | O_APPEND)
#define CREATE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
#define MAXCHARNUM 128
#define MAXARGNUM 32
char *argsexec[MAXARGNUM]; /*This stores my executable arguments like cd ls.*/
void ioredirection(int f){
int k,i,m;
int input=-1;
int output=-1;
int append=-1;
int fdin,fdout;
for(k=0; k<f; k++){
if(strcmp(argsexec[k],"<")==0){
input=k; // argument place of "<"
m=1;
argsexec[k]=NULL;
}
else if(strcmp(argsexec[k],">")==0){
output=k; // argument place of ">"
m=2;
argsexec[k]=NULL;
}
else if(strcmp(argsexec[k],">>")==0){
append=k; // argument place of ">>"
m=3;
argsexec[k]=NULL;
}
}
if(m==1){
int inp1;
fdin=open(argsexec[input+1],O_RDONLY,CREATE_MODE);
dup2(fdin,STDIN_FILENO);
close(fdin);
inp1=execlp(argsexec[0],argsexec[0],NULL);
}
if(m==2){
fdout = open(argsexec[output+1], CREATE_FLAGS, CREATE_MODE);
dup2 (fdout, STDOUT_FILENO);
close(fdout);
execvp(argsexec[0],argsexec);
}
if(m==3){
fdout = open(argsexec[append+1], CREATE_FLAGS1, CREATE_MODE) ;
dup2 (fdout, STDOUT_FILENO);
close(fdout);
execvp(argsexec[0],argsexec);
}
}
b 是这样变化的:
inpu=strtok(str," ");
while(inpu!=NULL){
argsexec[b]=inpu;
b++;
inpu = strtok(NULL, " ");
}
我用子进程调用它。
if (pid==0){
ioredirection(b);
我希望清楚地理解,我的完整代码真的很长,我试着像这样剪掉它。任何建议将不胜感激。
【问题讨论】:
-
你同时使用制表符还是空格?代码格式确实不一致,代码很难阅读。
-
实际上今晚我有这个学校项目的截止日期。这就是为什么我无法正确格式化它的原因。抱歉。
-
JFYI 格式良好且结构良好的代码通常更容易支持和调试,即使在截止日期临近时也是如此。
-
这对您当前的问题没有帮助,但是我使用的几乎每个主要 IDE 都有某种自动格式化程序。当您的项目完成后,为您的特定开发环境查找“美化”或“漂亮打印”或“格式代码”。然后,你真的不必担心它。只需运行该工具,它就会保持一致。 :-)
标签: c string shell unix redirect