2016-08-04 69 views

Antwort

2

Dateideskriptor ist eine per-Prozessressource, nicht pro-Thread. Sie können es also nicht nur für einen Thread umleiten.

1

Sie können printf() umschließen und einen bestimmten Code hinzufügen, um zu erkennen, in welchem ​​Thread Sie sich befinden und ob Sie den formatierten Text drucken können oder nicht.

0

Sie können eine benutzerdefinierte Protokollfunktion erstellen und nur nicht benötigte Nachrichten filtern. Es könnte in etwa so aussehen:

#include <stdio.h> 
#include <pthreads.h> 

struct Logger 
{ 
    pthread_t blockedThreads[256]; 
    int qty; 
}; 

struct Logger *createLogger() 
{ 
    struct Logger *logger = (Logger *)malloc(sizeof(Logger)); 
    logger->qty = 0; 
    return logger; 
} 

void blockThread(struct Logger *logger, pthread_t thread) 
{ 
    for (int i = 0; i < logger->qty; ++i) { 
     if (logger->blockedThread[i] == thread { 
      return; 
     } 
    } 

    logger->blockedThreads[logger->qty] = thread; 
    logger->qty++; 
} 

void log(struct Logger *logger, const char *message) 
{ 
    for (int i = 0; i < logger->qty; ++i) { 
     if (logger->blockedThread[i] == pthread_self()) { 
      return; 
     } 
    } 

    // DO REAL LOGGING HERE 
} 

Ich hoffe meine Idee ist klar genug für Sie.

+0

Dies ist ein [tag: c] Frage ..... – LPs

+0

sorry, wollte nur eine Idee zum Ausdruck bringen, Implementierung ist nicht schwer. aber ich fand ein paar Minuten und versuchte meine Lösung in C umzuschreiben. –

0

Sie können fprintf anstelle von printf und schreiben für jeden spezifischen Thread zu verschiedenen FD

#define CONSOLE_ENABLED (void *)(1) 
#define CONSOLE_DISABLED (void *)(2) 

void *Tsk_X(void *arg) 
{ 
    FILE* console = NULL; 

    if (arg == CONSOLE_DISABLED) 
     console = fopen("/dev/null", "w"); 
    else 
     console = stdout // or stderr that is unbuffered 

    if (console != NULL) 
    { 
     fprintf(console, "Your strings"); 
    } 
}