gpt4 book ai didi

C++ 暂时重定向或禁用 stdio

转载 作者:太空狗 更新时间:2023-10-29 21:15:34 27 4
gpt4 key购买 nike

在 MacOS X 下的 C++ 项目中,我们使用 stdio 与客户端进行交互。然而,我们使用的 dylib 也使用 stdio 来打印“打开的日志文件”。这打破了我们的客户和应用程序之间的所有通信。我查看了将 stdio 重定向到文件或暂时禁用 stdio 的示例。然而,我们未能成功。

那么,我们如何在与 dylib 交互时暂时禁用或重定向 stdio。

最佳答案

void RedirectStandardStreamsToDEVNULL(int *_piOriginalSTDIN_FILENO, int *_piOriginalSTDOUT_FILENO, int *_piOriginalSTDERR_FILENO)
{
//flushing pending things before redirection.
//fflush(stdin);
fflush(stdout);
fflush(stderr);

*_piOriginalSTDIN_FILENO = dup(STDIN_FILENO);
*_piOriginalSTDOUT_FILENO = dup(STDOUT_FILENO);
*_piOriginalSTDERR_FILENO = dup(STDERR_FILENO);

int devnull = open("/dev/null", O_RDWR);
dup2(devnull, STDIN_FILENO);
dup2(devnull, STDOUT_FILENO);
dup2(devnull, STDERR_FILENO);
close(devnull);
}
void RestoreStandardStreams(int *_piOriginalSTDIN_FILENO, int *_piOriginalSTDOUT_FILENO, int *_piOriginalSTDERR_FILENO)
{
//flushing pending things before restoring.
//fflush(stdin);
fflush(stdout);
fflush(stderr);

dup2(*_piOriginalSTDIN_FILENO, STDIN_FILENO);
dup2(*_piOriginalSTDOUT_FILENO, STDOUT_FILENO);
dup2(*_piOriginalSTDERR_FILENO, STDERR_FILENO);
}

void myfunction()
{
int iOriginalSTDIN_FILENO = -1;
int iOriginalSTDOUT_FILENO = -1;
int iOriginalSTDERR_FILENO = -1;
RedirectStandardStreamsToDEVNULL(&iOriginalSTDIN_FILENO, &iOriginalSTDOUT_FILENO, &iOriginalSTDERR_FILENO);

//all of your code which prints to stdout or stderr will be directed to /dev/null

RestoreStandardStreams(&iOriginalSTDIN_FILENO, &iOriginalSTDOUT_FILENO, &iOriginalSTDERR_FILENO);

}

重要的一点是从您的代码中识别在 dylib 中调用的函数。现在,用上面描述的重定向和恢复函数包围这些函数。

关于C++ 暂时重定向或禁用 stdio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37385560/

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