c - 有没有办法在一个线程而不是其他线程中关闭 stderr 的输出?

标签 c linux

假设我的程序有一些线程,因为文件描述符在线程之间共享,如果我调用close(stderr),所有线程都不会输出到stderr。我的问题:有没有办法在一个线程中关闭 stderr 的输出,而不是其他线程?

更具体地说,我的程序的一个线程调用了第三方库函数,并且它一直输出我知道没有用的警告消息。但我无权访问此第三方库源。

最佳答案

没有。文件描述符是进程中所有线程都可用的全局资源。当然,标准错误是文件描述符编号 2,因此它是全局资源,您无法阻止第三方代码写入它。

如果问题严重到需要治疗,您可以:

int fd2_copy = dup(2);
int fd2_null = open("/dev/null", O_WRONLY);

在调用你的第三方库函数之前:

dup2(fd2_null, 2);
third_party_library_function();
dup2(fd2_copy, 2);

基本上,在第三方库运行期间,将标准错误切换到/dev/null,函数后恢复正常输出。

当然,您应该对系统调用进行错误检查。

这样做的缺点是,当这个线程正在执行第三方函数时,任何其他需要写入标准错误的线程也会写入到/dev/null

您可能需要考虑添加一个可以与“第三方库执行线程”(TPLET) 同步的“错误写入线程”(EWT)。其他线程会向 EWT 写入消息。如果 TPLET 正在执行第三方库,EWT 会等到它完成,然后才写入任何排队的消息。 (虽然这会“起作用”,但这是一项艰苦的工作。)

解决此问题的一种方法是让通用代码(第三方库代码除外)使用的错误报告函数写入 fd2_copy 而不是标准错误本身。这需要有纪律地使用错误报告功能,但整个堆比一个额外的线程更容易。

关于c - 有没有办法在一个线程而不是其他线程中关闭 stderr 的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16829891/

相关文章:

c - stdint.h 库中是否包含整数类型 "extended integer types"?

c - C 中的虚假 getter/setter 函数返回错误值

c - 在 Xilinx Platform Studio 中映射端口并用 C 读取它

regex - BASH 查找大量文件中任意范围数字的正则表达式

c - 使用分散聚集处理短读/写的技术?

c++ - C++套接字-客户端出现段错误(Linux)

c - 编写我的 Server.c 套接字维护多线程的问题

c - 在 gcc 中使用内置函数 __builtin_add_overflow_p

c - 追踪包含文件(包含链)

c - 如何使用 TOS 设置消息优先级?