嘿大家,我知道这是一个非常受欢迎的实现,所以我想我不需要解释那么多。现在我在shell中做的是管道操作,在我将它复制到我的大shell之前,我希望看到它在“ls -l | tail -n 2”的示例中工作。所以这是我的代码,在我的代码的最后它做什么它只是什么,它没有写任何东西,我没有得到任何分段错误。谢谢佣工! C代码:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#define OUT 1
#define IN 0
int main ()
{
int fd,secondSon,firstSon;
int inAndOut[2];
char* lsArgs[2];
lsArgs[0]= "ls";
lsArgs[1]= "-l";
char* tailArgs[3];
tailArgs[0]="tail";
tailArgs[1]="-n";
tailArgs[2]="2";
pipe(inAndOut);
firstSon = fork();
if(firstSon==0)
{
fd =dup2(inAndOut[OUT],STDOUT_FILENO);
close(fd);
execvp(lsArgs[0],lsArgs);
}
else
{
close(inAndOut[OUT]);
}
secondSon = fork();
if(secondSon==0)
{
fd =dup2(inAndOut[IN],STDIN_FILENO);
close(fd);
execvp(tailArgs[0],tailArgs);
}
else
{
waitpid(-1,&firstSon,0);
waitpid(-1,&secondSon,0);
close(inAndOut[IN]);
}
return 0;
}
答案 0 :(得分:1)
有几个问题。
fd =dup2(inAndOut[OUT],STDOUT_FILENO);
close(fd);
dup2
返回新的文件描述符,立即关闭它是没有意义的。你想关闭旧的。当你在它的时候,你想要关闭管道的另一半。
将close(fd)
的两次出现替换为
close(inAndOut[IN]);
close(inAndOut[OUT]);
您需要NULL终止您的参数列表。添加最后一个元素:
char* lsArgs[3];
lsArgs[0]= "ls";
lsArgs[1]= "-l";
lsArgs[2]= NULL;
,类似于另一个参数列表。