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

1 ответ

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

Другие вопросы по тегам