Я реализовал свои собственные функции регистрации сообщений для моей программы командной строки C, я хочу иметь возможность печатать информационные сообщения на stdout
, сообщения об ошибках на stderr
и предупреждения на оба без дублирования сообщения, если они выводятся в одно и то же местоположение.
Сообщения Info и Error работают нормально, но для предупреждающих сообщений я понятия не имею, как эффективно проверить, указывают ли потоки файлов stdout и stderr на одно и то же место вывода. Мой код работает, но я не могу понять, почему, потому что логически при пошаговом выполнении функции он должен создавать повторяющиеся записи, если stdout
и stderr
указывают на один и тот же файл.
Я проверял, когда stdout
и stderr
имеют один и тот же выходной файл, они по-прежнему выдают разные адреса памяти в указателях, а fileno(stdout)
и fileno(stderr)
отличаются.
tl; dr У меня есть код, который работает, но как Насколько я знаю ... это не должно быть. Может кто-нибудь помочь объяснить, почему он работает, или кто-нибудь знает правильный способ решить эту проблему.
Редактировать: я вызываю программу так: myProgram >out.lis 2>out.lis
Редактировать 2: Когда при таком вызове получаются дубликаты: myProgram >out.lis 2>&1
Мой код для предупреждающего сообщения:
/* Warning message, a unified function for printing warning messages */
/* Warning messages are printed to both the output log and the error log (if different) */
void warningMessage(char * msg) {
if (isatty(fileno(stderr))) {
/* Add color if printing to terminal */
fprintf(stderr, "\033[0;31;43mWarning: \033[0;30;43m%s\033[39;49m\r\n", msg);
} else {
fprintf(stderr, "\nWarning: %s\n", msg);
if (isatty(fileno(stdout))) {
fprintf(stdout, "\033[0;31;43mWarning: \033[0;30;43m%s\033[39;49m\r\n", msg);
} else {
fprintf(stdout, "\nWarning: %s\n", msg);
}
}
}
Любые другие указатели относительно моего кода также будут полезны! Я только недавно начал изучать C!