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

时间:2014-01-30 21:46:28

标签: c execvp dup2 pico

我想要做的是基本上使用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 */

我遇到的问题是,当我尝试在标准输出中write()时,pico不会显示在终端中,我得到了连续“S”(来自r)的奇怪输出,如下所示:

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

每当我尝试按任意键时,它会添加更多“S”。我对这一切都很陌生,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

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