假设我的程序有一些线程,因为文件描述符在线程之间共享,如果我调用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/