0

我想要做的基本上是使用 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" 。我对这一切都很陌生,任何帮助将不胜感激。

4

1 回答 1

0

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

于 2014-02-03T03:23:18.117 回答