如何使用dup2()和pipe()在我的shell中实现“ls | wc”?

如何使用dup2()和pipe()在我的shell中实现“ls | wc”?,c,C,如何使用dup2和管道函数将ls的输出重定向到wc的输入。因此,打印字数 这是我的尝试,但这不起作用 if(!strcmp(*ptr,"|")){ //argv[] contains the input partitioned by spaces //ignore the ptr for this case char arr[2]; pipe(arr); // 0 is read 1 is write dup2(stdout,arr[1]); /

如何使用dup2和管道函数将ls的输出重定向到wc的输入。因此,打印字数

这是我的尝试,但这不起作用

 if(!strcmp(*ptr,"|")){ //argv[] contains the input partitioned by spaces
                        //ignore the ptr for this case
char arr[2];
pipe(arr); // 0 is read 1 is write
dup2(stdout,arr[1]); // my redirected output

int a = fork();
if(a == 0){
  close(arr[0]);
  execvp(argv[0],argv);
}
     wait(NULL);

     dup2(0,arr[0]); // my redirected input 

int b = fork();
  if(b == 0){
    close(arr[1]);
    execvp(argv[2],argv);
  }
  wait(NULL);

  close(arr[0]);
  close(arr[1]);

return;

}所以你有6个明显的错误

缩进代码。 仅在子进程中调用dup2。 1不是标准,0不是标准。 如果execvp失败,请调用_exit。 waitNULL在第二个fork之前,而不是之后 dup2的参数被交换
因为这是家庭作业,我不会给你答案。把这个问题弄清楚,打电话给我,我会看看我还能找到什么。

我们真的应该为这个问题建立一个规范的实例——至少每周都有人问这个问题的新版本。stdout是一个文件*。dup2的第一个参数应该是一个整数。@CharlesDuffy:homography+每个问题每个问题都是唯一的问题time@CharlesDuffy我肯定会支持一个规范化的实例,说明如何将两个程序用管道连接在一起C@Joshua,…不是那么独特。我敢肯定,到目前为止,我们已经看到了80%的人会把事情搞砸。即使我们可以告诉人们修复规范实例中包含的错误,并且只返回新的/不同的错误,这与现状相比是一个很大的改进。此外,dup2参数被切换,因此他的arr是错误的类型。