очередь на вход - PullRequest
       14

очередь на вход

0 голосов
/ 05 марта 2012

Какой лучший способ собрать отладочные сообщения для записи в файл за один раз при выходе.

Я использую c и думал об использовании системы очередей.Будет ли это правильным решением.

Мне не нужно сложное решение.Все, что мне нужно, это чтобы строки журнала отладки были сохранены, а затем выпущены для записи в файл при вызове в конце программы за один раз. Любые примеры такой процедуры

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

fprintf() и т. Д. Уже буферизованы. Так что это автоматически сэкономит немного дискового времени для вас. Если вы настаиваете на дальнейшей буферизации, используйте setvbuf() с _IOFBF, чтобы поток, на который вы пишете, был полностью буферизован.

Обратите внимание, что stdout является буферизованной строкой, а stderr не буферизованной. Выберите параметры для setvbuf соответственно!

РЕДАКТИРОВАТЬ Как многие отмечали в комментариях к вопросу, имеет смысл иметь его без буферизации только тогда, когда поток имеет значение stdout или stdin Но когда поток является файлом отладки ( который вы анализируете после выхода из программы), и ваша программа ведет интенсивную регистрацию и работает в течение длительного времени, тогда имеет смысл буферизовать потоки.

Вот пример, который иллюстрирует использование блочных записей. Обычно все файлы имеют блочную буферизацию. Теперь я переопределю это поведение и сделаю его небуферизованным, используя setvbuf, и посмотрим, сколько будет разница во времени

#include<stdio.h>

int main()
{
    FILE *fp = fopen ("new.txt","w+");

    int i =0;

    /* Comment the below line to make fp buffered */
    i=setvbuf(fp, (char*) NULL,_IONBF, 0);

    if ( i )
    {
        printf("Error in setvbuf\n");
    }
    for ( long int i=1000000; i>0; i-- )
    {
        fprintf(fp,"Hello %ld\n",i );
    }

    fclose(fp);

    return 0;
}

С буферизацией (то есть, комментируя строку setvbuf), следующий вывод команды

time ./a.out

real    0m0.224s

user    0m0.192s

sys     0m0.020s

и без буферизации (т.е. включение setvbuf)

time ./a.out

real    0m4.479s

user    0m0.752s

sys     0m3.708s

Мы видим огромную разницу в 4,2 с !!

Надеюсь, это поможет кому-то попытаться узнать о буферизации и ведении журнала.

0 голосов
/ 05 марта 2012

Вот, пожалуйста:

#define SIZE_INCREMENT 10

const char **messages = NULL;
int messagesCount = 0;
int messagesSize = 0;

__attribute__((constructor))
static void initializeMessages(void)    
{
    messages = calloc(SIZE_INCREMENT, sizeof(const char *));
    messagesSize = SIZE_INCREMENT;
}

void addMessage(const char *message)
{
    if (messagesCount >= messagesSize)
    {
         messages = realloc(messages, messagesSize + SIZE_INCREMENT);
         messagesSize += SIZE_INCREMENT;
    }

    messages[messagesCount] = malloc(strlen(message) + 1);
    strcpy(messages[messagesCount], message);

    messagesCount++;
}

__attribute__((destructor))
static void logAllMessages(void)
{
     FILE *logFile = fopen("/path/to/log/file/", "w");
     for (int i = 0; i < messagesCount; i++)
     {
         fprintf(logFile, "%s", messages[i]);
         free(messages[i]);
     }

     free(messages);
     fclose(logFile);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...