gpt4 book ai didi

c - 如何在内存中缓冲标准输出并从专用线程写入它

转载 作者:太空狗 更新时间:2023-10-29 16:25:37 24 4
gpt4 key购买 nike

我有一个包含许多工作线程的 C 应用程序。重要的是它们不会阻塞,所以当工作线程需要写入磁盘上的文件时,我让它们写入内存中的循环缓冲区,然后有一个专用线程将该缓冲区写入磁盘。

工作线程不再阻塞。专用线程可以在写入磁盘时安全地阻塞而不影响工作线程(它在写入磁盘时不持有锁)。我的内存缓冲区已调整到足够大,以便编写器线程可以跟上。

这一切都很好。我的问题是,如何为 stdout 实现类似的东西?

我可以使用宏 printf() 来写入内存缓冲区,但我无法控制所有可能写入标准输出的代码(其中一些在第三方库中)。

想法?尼克B

最佳答案

我喜欢使用 freopen 的想法。您还可以使用 dupstdout 重定向到管道和 dup2 , 然后使用 read 从管道中获取数据。

像这样:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define MAX_LEN 40

int main( int argc, char *argv[] ) {
char buffer[MAX_LEN+1] = {0};
int out_pipe[2];
int saved_stdout;

saved_stdout = dup(STDOUT_FILENO); /* save stdout for display later */

if( pipe(out_pipe) != 0 ) { /* make a pipe */
exit(1);
}

dup2(out_pipe[1], STDOUT_FILENO); /* redirect stdout to the pipe */
close(out_pipe[1]);

/* anything sent to printf should now go down the pipe */
printf("ceci n'est pas une pipe");
fflush(stdout);

read(out_pipe[0], buffer, MAX_LEN); /* read from pipe into buffer */

dup2(saved_stdout, STDOUT_FILENO); /* reconnect stdout for testing */
printf("read: %s\n", buffer);

return 0;
}

关于c - 如何在内存中缓冲标准输出并从专用线程写入它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/955962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com