对于不同的POSIX线程,是否有可能为printf(3)实现标准输出的不同重定向?标准输入怎么样?
我有很多基于标准输入/输出的代码,我只能将这些代码分成不同的POSIX线程,而不是进程。 Linux操作系统,C标准库。 我知道我可以重构代码以将printf()替换为fprintf()并进一步以此样式替换。 但在这种情况下,我需要提供旧代码所没有的某种上下文。
所以没有人有更好的想法(查看下面的代码)?
#include <pthread.h>
#include <stdio.h>
void* different_thread(void*)
{
// Something to redirect standard output which doesn't affect main thread.
// ...
// printf() shall go to different stream.
printf("subthread test\n");
return NULL;
}
int main()
{
pthread_t id;
pthread_create(&id, NULL, different_thread, NULL);
// In main thread things should be printed normally...
printf("main thread test\n");
pthread_join(id, NULL);
return 0;
}
答案 0 :(得分:4)
如果使用clone
创建线程,则可以执行所需操作,但POSIX.1表示线程必须共享打开的文件描述符。
你可以尝试一些技巧,但你真的应该将调用转换为接受函数的FILE *
参数。
答案 1 :(得分:1)
在* nix系统上,文件描述符上的stdio层和文件描述符对于进程是全局的。因此,如果不改变某事,就没有办法做你想做的事。最好的办法是使用fprintf()重写代码。由于这涉及到arglist添加一个参数,我甚至不确定你是否能够使用预处理器技巧来实现你的目标,而无需修改实际的代码。
也许您可以澄清一下您无法创建新流程的原因?从这个角度来看,问题可能是可以解决的。
答案 2 :(得分:1)
答案 3 :(得分:0)
如果你坚持使用像“printf()”这样的标准I / O函数,那么我能想到的唯一方法就是标准的I / O库支持使用特定于线程的I / O.线程局部数据结构(类似于“errno”的方式是一个调用返回线程局部错误号的函数的宏)。我不知道执行此操作的标准I / O的任何实现。