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