Я уверен в своей сложности, но не в ее причине, поэтому мой заголовок может быть не очень хорошим вопросом для этой проблемы: /
Я создаю функцию, которая работает как printf, давайте назовите это print2
, и для тестирования я написал этот небольшой код, который включает перенаправление stdout и макроса, потому что я хочу видеть на стандартном выводе действие реального printf, действие моего print2
и сохраните эти результаты в двух файлах out1 и out2 (чтобы сравнить их после этого). он работает нормально (см. ниже), но по другим причинам мне нужно изменить порядок действий в макросе, и здесь возникают проблемы.
что работает:
#include "printf2.h"
#include <stdio.h> // for printf
#include <fcntl.h> // for dup() and dup2() and open() and close()
#define PRINT(string) \
printf("printf:" string "\n"); \
print2("print2:" string "\n\n"); \
dup2(out1, 1); \
printf("printf:" string "\n"); \
dup2(out2, 1); \
print2("print2:" string "\n"); \
dup2(save, 1);
int main(void)
{
int out1 = open("out1.txt", O_WRONLY | O_TRUNC);
int out2 = open("out2.txt", O_WRONLY | O_TRUNC);
int save = dup(1);
PRINT("test1");
PRINT("test2");
close(out1);
close(out2);
close(save);
return (0);
}
, который выводит на консоль следующие выходные данные:
printf:test1
print2:test1
printf:test2
print2:test2
и out1.txt:
printf:test1
printf:test2
и out2.txt:
print2:test1
print2:test2
отлично, я могу визуально сравнить на консоли и написать функцию для сравнения в файлах.
что не работает:
Но, как я уже сказал, Конечно, мой код намного сложнее, и по внешней причине мне нужно сделать это в другом порядке, например (сначала записать в файлы, затем на консоли):
#define PRINT(string) \
dup2(out1, 1); \
printf("printf:" string "\n"); \
dup2(out2, 1); \
print2("print2:" string "\n"); \
dup2(save, 1); \
printf("printf:" string "\n"); \
print2("print2:" string "\n\n");
, и это приводит меня в замешательство все, на консоли у меня есть это:
print2:test1
print2:test2
printf:test1
printf:test1
printf:test2
printf:test2
в файле out1.txt:
[empty]
в файле out2.txt:
print2:test1
print2:test2
Я попытался заменить все экземпляры printf () на print2 () или write (), и это сработало, поэтому мне кажется, что printf просто слишком долго печатается на консоли и т. дескриптор выходного файла уже был изменен ... Я прав? и есть ли решение? Можно ли ждать завершения printf, прежде чем продолжить программу?