每个POSIX线程有不同的标准流

时间:2010-05-19 18:08:44

标签: c multithreading unix posix stdio

对于不同的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;
}

4 个答案:

答案 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的任何实现。