在Linux中将stdout连接到同一进程的stdin

时间:2018-06-20 04:09:31

标签: stdout stdin capture

我正在编写一个(ab)使用APL引擎libapl.so的应用程序。该库包含使我能够捕获结果的机制,但是它会将某些内容转储到stdout和stderr。所以我的问题是,有没有办法捕获写到stdout的内容,而不是让它们进入屏幕,通过管道传输到另一个进程等等?例如,是否可以将stdout连接到同一进程的stdin?我已经修改了pipe2(),dup(2)和GTK + / Glib中的各种怪异之处,但是我还没有找到合适的方法。

1 个答案:

答案 0 :(得分:0)

需要更多戳戳-至少一种解决方案似乎是创建一个fifo,将其两次open(),一次用于读取,一次用于写入,并将df2 dup2()写入标准输出fd。这导致对stdout的写入通过fifo管道进行传输,应用程序可以在其中读取它。 (感谢将近7年前名叫Hasturkun的人的启发。)

这里有一些演示代码:

#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

int
main (int ac, char *av[])
{
  char tname[64];
  sprintf (tname, "/tmp/testpipe%d", (int)getpid ());
  int rc = mkfifo (tname, 0666);
  if (rc != 0) {
    perror ("Creating fifo");
    return 1;
  }

  int temp_in_fd  = open (tname, O_NONBLOCK | O_RDONLY);
  if (temp_in_fd < 0) {
    perror ("Opening new input");
    return 1;
  }
  int temp_out_fd = open (tname, O_NONBLOCK | O_WRONLY);
  if (temp_out_fd < 0) {
    perror ("Opening new output");
    return 1;
  }

  FILE *temp_in  = fdopen (temp_in_fd,  "r");
  if (!temp_in) {
    perror ("Creating new input FILE");
    return 1;
  }
  FILE *temp_out = fdopen (temp_out_fd, "w");
  if (!temp_out) {
    perror ("Creating new input FILE");
    return 1;
  }

  dup2 (fileno (temp_out), STDOUT_FILENO);

  printf("Woot!");
  fflush(stdout);

#define BFR_SIZE        64
  char bfr[BFR_SIZE];
  ssize_t sz = fread (bfr, 1, BFR_SIZE, temp_in);
  fprintf (stderr, "got %d bytes: \"%s\"\n", (int)sz, bfr);

  fclose (temp_out);
  fclose (temp_in);
  unlink (tname);
  return 0;
}