Перенаправить printf () в STDIN другого процесса - PullRequest
0 голосов
/ 20 ноября 2018

Я пытался написать некоторый код, который перенаправляет записи в STDOUT_FILENO, через запись (1, строка, strlen (строка)) или printf(), в STDIN_FILENO другого процесса.Другой процесс будет /usr/bin/less.Кажется, ничего не работает, несмотря на то, что на этом сайте было предпринято немало попыток, много человек читал страницы и пробовал каждую комбинацию close() и dup2().

Спасибо за помощь, спасибо.

#include  <fcntl.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>
#include  <sys/types.h>
#include  <sys/wait.h>
#include  <sys/stat.h>
#include  <termios.h>
#include  <unistd.h>
#define INPUT_END 1
#define OUTPUT_END 0
int main(int argc, char* argv[]){
   pid_t pid1;
   pid_t pid2;
   int fd1[2], fd2[2];
   int x;
   pipe(fd1);
   pipe(fd2);
   pid1 = fork();

   if (pid1 == -1) {
      fprintf(stderr, "pid error\n");
      exit(1);
   }

   if(pid1 == 0) {
      close(fd1[INPUT_END]);
      dup2(fd1[OUTPUT_END], STDIN_FILENO);
      close(fd1[OUTPUT_END]);
      close(fd2[OUTPUT_END]);
      dup2(fd2[INPUT_END], STDOUT_FILENO);
      close(fd2[INPUT_END]);
      execlp("less", "-r",(char*) NULL);

   }else {
      close(fd1[OUTPUT_END]);
      dup2(fd1[INPUT_END], STDOUT_FILENO);
      close(fd1[INPUT_END]);
      close(fd2[INPUT_END]);
      dup2(fd2[OUTPUT_END], STDIN_FILENO);
      close(fd2[OUTPUT_END]);

      for(x=0;x<100;x++) {
         write(STDOUT_FILENO, "AAA\n", 4);
         printf("AAA\n");
         fflush(stdout);
      }

      close(fd1[OUTPUT_END]);
      close(fd1[INPUT_END]);
      close(fd2[OUTPUT_END]);
      close(fd2[INPUT_END]);
      waitpid(-1, NULL, 0);
   }
}

1 Ответ

0 голосов
/ 20 ноября 2018

Ваша программа делает именно то, что вы запрограммировали: она создает два канала и один дочерний процесс выполняется меньше, используя каналы для перенаправления стандартного вывода программы на стандартный вывод меньше и стандартного вывода меньше на стандартный вывод программы.Затем он записывает кучу данных (которые меньше копирует в свой стандартный вывод программы) и ожидает, когда меньше будет завершено.Но этого никогда не произойдет, так как меньше ждет большего ввода.

Если вы хотите, чтобы все прекратилось, вам нужно будет close(STDOUT_FILENO) перед вызовом waitpid - если вы добавите это, меньшевыйдет, и waitpid вернется, и ваша программа продолжит работу (и выйдет).Вы все равно ничего не увидите на своем терминале, так как в терминал ничего не пишется - меньше пишет на стандартный вывод вашей программы (которую вы никогда не читаете).

Если вы увеличите количествоПри записи данных вы увидите тупик - так как вы никогда не читаете stdin, как только канал fd2 заполняется, less блокирует запись, а затем, когда fd1 также заполняется, ваша программа блокируется.Размеры каналов по умолчанию в Linux довольно велики, однако, для этого потребуется много данных.

Обратите внимание, что вы также можете использовать cat, так как less - less по существу переходит кcat когда стандартный вывод не является терминалом.

Если вы хотите выводить данные на свой терминал, используя less для передачи этого (остановка после страницы и т. Д.), Вам необходимо выйти из стандартного вывода.less указывает на ваш терминал.Просто удалите fd2 и каждую строку, относящуюся к fd2 из приведенного выше кода, и она должна работать - хотя она все равно будет висеть в конце, если вы не close(STDOUT_FILENO)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...