【发布时间】:2018-12-04 18:09:54
【问题描述】:
我正在尝试在 c 中创建一个自定义 shell,当我运行时
密码 | ./显示
它将获取 pwd 输出并将其作为 ./show 的命令行参数传递,并且必须使用管道。
我已经阅读了我能找到的任何相关问题,但我无法让它发挥作用。
到目前为止,我认为我已成功将输出引导到管道中,但我不知道如何将其传递给 ./show。我一直在打印它只是为了验证它是否能通过管道。
if(option == 2){
getArgs(&A,args,directory,&size);
pipe(fd);
pid = fork();
if(!pid){
dup2(fd[1],STDOUT_FILENO); //output into pipe
close(fd[0]);
close(fd[1]);
com=args[0];
for(i=1;i<(size-2);i++){
com=concat(com," ");
com=concat(com,args[i]);
}
readCommand(args,directory,com,(size-1));
return 1;
}
close(fd[1]);
int nbytes = read(fd[0], foo, sizeof(foo));
printf("Output: (%.*s)\n", nbytes, foo);
}
exec 发生在 readCommand 内部,所以它在这里
void readCommand(char *args[10],char *directory,char *com, int i){
if(execl(directory, args[i],args[i+1], NULL)==-1){
execl("/bin/sh", "/bin/sh", "-c", com, NULL);
perror("execlp");
}
else{
execl(directory, args[0],args[1],args[2],args[3],args[4], NULL); //max number of args=4
perror("execlp");
}
}
我之前尝试过让它与两个分叉一起工作,但后来我不确定我的输出重定向是否正确,而且它似乎更难失败。如果有帮助,我也可以包含该代码。
感谢您的帮助,我的最后期限是几个小时后...
更新:阅读答案后我更新了代码
if(option == 2){
getArgs(&A,args,directory,&size);
pipe(fd);
if (!fork()) {
pipe(fd);
if(!fork()) {
dup2(fd[1], 1);
close(fd[0]);
close(fd[1]);
execlp(args[0], args[0], NULL);
}
else {
dup2(fd[0], 0);
close(fd[0]);
close(fd[1]);
execlp(args[size-1], args[size-1], NULL);
}
}
wait(NULL);
}
现在我打印了一个空行,然后提示输入新命令。
【问题讨论】:
标签: c shell redirect pipe output