Запуск пико с использованием 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 будет отображаться нормально.