代码之家  ›  专栏  ›  技术社区  ›  Roman Nikitchenko

每个POSIX线程的不同标准流

  •  0
  • Roman Nikitchenko  · 技术社区  · 14 年前

    对于标准输出(如printf(3),对于不同的posix线程,是否有可能实现不同的重定向?标准输入呢?

    我有很多基于标准输入/输出的代码,我只能将这些代码分为不同的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 回复  |  直到 14 年前
        1
  •  4
  •   nategoose    14 年前

    如果使用 clone 但是posix.1说线程必须共享打开的文件描述。

    您可以尝试几种技巧,但您确实应该将呼叫转换为 FILE * 接受函数的参数。

        2
  •  1
  •   Chris Cleeland    14 年前

    在*nix系统上,文件描述符上的stdio层和文件描述符对进程是全局的。因此,没有办法不改变就做你想做的事 某物 . 最好的办法是使用fprintf()重写代码。因为这涉及到在arglist中添加一个参数,所以我甚至不确定您是否能够使用预处理器技巧来实现您的目标而不修改实际的代码。

    也许你可以澄清你不能创建新流程的原因?从这个角度来说,这个问题可能是可以解决的。

        3
  •  1
  •   R.. GitHub STOP HELPING ICE    14 年前

    如果您有线程本地存储,可以执行以下操作:

    #undef printf
    #define printf(fmt, ...) fprintf(my_threadlocal_stdout, fmt, __VA_ARGS__)
    

    同样,对于您打算使用的所有其他stdio函数。当然,最好不要尝试重新定义相同的名称,而是在源文件上执行搜索和替换以使用备用名称。

    btw即使没有编译器的线程本地存储扩展,也可以使用返回右键的函数调用 FILE * 用于调用线程。

        4
  •  0
  •   Steve Emmerson    14 年前

    如果您坚持使用“printf()”之类的标准I/O函数,那么我能想到的唯一方法就是让标准I/O库使用线程本地数据结构支持特定于线程的I/O(类似于“errno”是调用返回线程本地错误号的函数的宏)。我不知道有什么标准I/O实现可以做到这一点。