Ответ 1
Вы можете сохранить глобальную переменную stdout
до bar();
, а затем установить ее на /dev/null
, а затем восстановить. Пример кода;
#include <stdio.h>
int main() {
int old_stdout = dup(1);
freopen ("/dev/null", "w", stdout); // or "nul" instead of "/dev/null"
printf("asd1");
fclose(stdout);
stdout = fdopen(old_stdout, "w");
printf("asd2");
return 0;
}
Протестировано на OS X, не уверен в Windows.
РЕДАКТИРОВАТЬ: Вы можете заменить /dev/null
на nul
на Windows. Что касается fdopen()
и dup()
, работающих под Windows, они являются частью стандарта POSIX.1 в соответствии с моими страницами man
, но я его не тестировал.
РЕДАКТИРОВАТЬ 2: Как указано в комментариях, если решение не работает для Windows, есть еще одно предложение в this SO answer.
EDIT 3: Более длинный, хотя и стандартный и кросс-платформенный способ сделать это следующим образом. (код, адаптированный из упомянутого вопроса SO, и документация Microsoft для _dup)
#include <stdio.h>
#ifdef _WIN32
#include <io.h>
char * const nulFileName = "NUL";
#define CROSS_DUP(fd) _dup(fd)
#define CROSS_DUP2(fd, newfd) _dup2(fd, newfd)
#else
#include <unistd.h>
char * const nulFileName = "/dev/null";
#define CROSS_DUP(fd) dup(fd)
#define CROSS_DUP2(fd, newfd) dup2(fd, newfd)
#endif
int main() {
int stdoutBackupFd;
FILE *nullOut;
/* duplicate stdout */
stdoutBackupFd = CROSS_DUP(STDOUT_FILENO);
fflush(stdout);
nullOut = fopen(nulFileName, "w");
CROSS_DUP2(fileno(nullOut), STDOUT_FILENO);
printf("asd1\n");
fflush(stdout);
fclose(nullOut);
// Restore stdout
CROSS_DUP2(stdoutBackupFd, STDOUT_FILENO);
close(stdoutBackupFd);
printf("asd2\n");
return 0;
}
Флеши необходимы, чтобы удостовериться, что (1) что-либо напечатано до того, как выключение стандартного вывода действительно напечатано на экране, и (2) ничего не напечатано до того, как будет напечатано сообщение stdout на консоль (или трубу).