запуск pico с использованием execvp после dup2 в C

То, что я хочу сделать, это в основном сделать из дочернего процесса стандартную запись в конец записи канала с помощью dup2 и запустить pico с помощью execvp, и родитель прочитает конец файла для чтения, сделает что-то с ним и запишет его в стандартный выход и отображать его в пико. Это запускается под 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» всякий раз, когда я пытаюсь нажать любую клавишу. Я довольно новичок во всем этом, и любая помощь будет оценена по достоинству.


person yellow    schedule 30.01.2014    source источник
comment
Я бы сказал, что pico ожидает, что stdin будет терминалом, и делает что-то другое (или вообще не работает), если это не так, например. если stdin - труба.   -  person Brave Sir Robin    schedule 31.01.2014
comment
Любая идея о том, как я могу это исправить?   -  person yellow    schedule 31.01.2014
comment
Прежде всего, попробуйте повторить что-нибудь | pico даже работает так, как вы хотите.   -  person Brave Sir Robin    schedule 03.02.2014


Ответы (1)


Я думаю, что знаю, что здесь происходит: поскольку стандартный вывод перенаправляется в конвейер, когда pico пытается напечатать в стандартный вывод, он на самом деле печатает в конвейер, и на экране ничего не появляется. Вы должны вручную печатать на стандартный вывод в родительском. Попробуйте изменить «write(1,r,1)» на «write(1, read_buf, 1)», и pico будет отображаться нормально.

person UM3430    schedule 03.02.2014