如何在Linux上临时捕获自己进程的stdout?

如何在Linux上临时捕获自己进程的stdout?,linux,qt,qt4,posix,stdout,Linux,Qt,Qt4,Posix,Stdout,我试图在QTextWidget中显示方法的输出。该方法在标准输出上打印json,它是第三方代码的一部分,我无法更改 看起来是这样的: int iperf_json_finish(struct iperf_test *test) { char *str; str = cJSON_Print(test->json_top); if (str == NULL) return -1; fputs(str, stdout); putchar(

我试图在QTextWidget中显示方法的输出。该方法在标准输出上打印json,它是第三方代码的一部分,我无法更改

看起来是这样的:

int iperf_json_finish(struct iperf_test *test)
{
    char *str;

    str = cJSON_Print(test->json_top);
    if (str == NULL)
        return -1;
    fputs(str, stdout);
    putchar('\n');
    fflush(stdout);
    free(str);
    cJSON_Delete(test->json_top);
    test->json_top = test->json_start = test->json_intervals = test->json_end = NULL;
    return 0;
}
那么,我怎么能做到呢?我使用的是Qt4.8,不能使用QMessageLogContext之类的东西

如何在Linux上临时捕获自己进程的stdout

诀窍是用您自己管道的描述符替换标准输出文件描述符,用管道截取输出,然后将原始标准输出放回原处

*NIX平台的总体方案是:

  • 保存标准输出的原始文件描述符:
    int orig\u stdin=dup(1)

  • 准备管道:
    管道(盖)

  • 不要忘记刷新stdio:
    fflush(stdout)

  • stdout
    替换为管道的写入端:
    dup2(1,cap_stdout[1])

  • cap\stdout[0]
    文件描述符开始额外的线程读取。这是截取数据的地方

  • 调用第三方库函数

  • 刷新stdio:
    fflush(stdout)

  • 向读取线程发送终止信号

  • 恢复stdin:
    dup2(原始stdin,1)

  • 清理:
    close(cap_stdout[0]);关闭(cap_stdout[1]);关闭(原标准)

  • 您想要的数据是读取线程已经读取的数据


  • 请注意,需要额外的线程,因为管道的缓冲区空间有限,如果没有读卡器线程,对(管道)标准输出的写入将被阻塞,从而导致应用程序内部死锁。

    是否可以修改该函数,或者你是在问如何在不修改所显示函数的情况下将
    stdout
    重定向到
    QTextWidget
    ?@Andreas这是api,所以我不能修改它。我想这将是一个挑战-也许这篇文章有帮助:@Andreas谢谢你的时间,但我使用的是Qt4和Linux。还有POSIX解决方案。从@Andreas查看链接