Как подавить вывод при использовании динамической библиотеки?

У меня есть решение этой проблемы, но мне интересно, есть ли более приятное решение.

Мне нужно загрузить библиотеку в мою утилиту, используя dlopen , а затем вызвать одну из функций.

К сожалению, функция выводит на STDOUT целую кучу информации, и это я не хочу.

У меня есть непереносимое решение, и мне интересно, есть ли лучшее, более универсальное решение, которое я мог бы использовать.

Вот что у меня есть ( NB : Это C):

/*
 * Structure for retaining information about a stream, sufficient to
 * recreate that stream later on
 */
struct stream_info {
    int fd;
    fpos_t pos;
};
#define STDOUT_INFO 0
#define STDERR_INFO 1

struct stream_info s_info[2];
point_stream_to_null(stdout, &s_info[STDOUT_INFO]);
point_stream_to_null(stderr, &s_info[STDERR_INFO]);

void *output = noisy_function();

reset_stream(stderr, &s_info[STDERR_INFO]);
reset_stream(stdout, &s_info[STDOUT_INFO]);

/*
 * Redirects a stream to null and retains sufficient information to restore the stream to its original location
 *** NB ***
 * Not Portable
 */
void point_stream_to_null(FILE *stream, struct stream_info *info) {
    fflush(stream);
    fgetpos(stream, &(info->pos));
    info->fd = dup(fileno(stream));
    freopen("/dev/null", "w", stream);
}

/*
 * Resets a stream to its original location using the info provided
 */
void reset_stream(FILE *stream, struct stream_info *info) {
    fflush(stream);
    dup2(info->fd, fileno(stream));
    close(info->fd);
    clearerr(stream);
    fsetpos(stream, &(info->pos));
}

Есть предложения?

5
задан Dancrumb 21 January 2011 в 14:59
поделиться