在C中dup2之后使用execvp运行pico

在C中dup2之后使用execvp运行pico,c,execvp,dup2,C,Execvp,Dup2,我想做的基本上是使用dup2将子进程的标准输出写入管道的写入端,并使用execvp运行pico,父进程将读取文件的读取端,并对其进行处理,然后将其写入标准输出,并在pico中显示。这是在Linux机器下运行的 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> int main(int argc

我想做的基本上是使用dup2将子进程的标准输出写入管道的写入端,并使用execvp运行pico,父进程将读取文件的读取端,并对其进行处理,然后将其写入标准输出,并在pico中显示。这是在Linux机器下运行的

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc,char* argv[])
{

   char* arguments[] = {"pico", "a.txt", NULL};

   int my_pipe[2];
   if(pipe(my_pipe)==-1)
      fprintf(stderr,"Error\n");

   pid_t child_id;
   child_id = fork();
   if(child_id == -1)
   {
       fprintf(stderr, "Fork error\n");
   }
   if(child_id==0)
   {
       close(my_pipe[0]);
       dup2(my_pipe[1],1); /*make standard out write in the write end of the pipe?*/
       close(my_pipe[1]);
       execvp("pico",arguments);

       fprintf(stderr, "Exec failed\n");
       exit(0);

   }
    close(my_pipe[1]);
    char reading_buf[1];
    char r[] = "S";
    while(read(my_pipe[0], reading_buf,1)>0)/*read something in the pipe*/
    {

        write(1,r,1);/*display "S" in pico*/


    }
    close(my_pipe[0]);



return 0;


}  /* end main */

每当我按下任何键时,它都会添加更多的“S”。我对所有这些都很陌生,如果有任何帮助,我将不胜感激。

我想我知道这里发生了什么:因为stdout被重定向到管道,当pico尝试打印到stdout时,它实际上是打印到管道上,屏幕上什么也没有显示。您必须在父级中手动打印到标准输出。尝试将“write(1,r,1)”更改为“write(1,reading_buf,1)”,pico将正常显示。

我想说pico希望
stdin
成为一个终端,如果不是这样的话,会做一些不同的事情(或者根本不起作用),例如
stdin
是一个管道。你知道如何修复它吗?首先,试试“echo something | pico”甚至可以按你的意愿工作。
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS