Компиляция с TCC на Cygwin - PullRequest
1 голос
/ 23 апреля 2011

Я тестировал очень простую программу, написанную на C, полная часть которой приведена ниже.После попытки выполнить исполняемый файл, созданный TCC, я заметил, что мне нужно было вводить ввод для каждого последующего вызова fgets () до фактического просмотра вывода из любых вызовов printf ().

Это очень сбивало с толку, поэтому ярешил попробовать запустить исполняемый файл на стандартной консоли Windows.Он работал безупречно, а подсказки ввода и вывода отображались в правильном порядке.

Однако я заметил, что если я скомпилирую программу с GCC, она будет работать нормально на терминале, скомпилированном в Cygwin (mintty, хотя я получилте же самые результаты с rxvt).

Может ли кто-нибудь объяснить, почему это происходит, и как я могу остановить это?Я хотел бы компилировать свои программы независимо от Cygwin, все еще используя терминал на основе Cygwin.

Спасибо!

int main()
{
        char something[12];

        printf("This printf() should be outputted before you are prompted for input: ");

        fgets(something, sizeof something, stdin);

        printf("You entered, %s", something);
}

Ответы [ 3 ]

2 голосов
/ 23 апреля 2011

Это до буферизации стандартного ввода и стандартного вывода.Я не уверен, что стандарт C говорит об этом (в C ++ потоки связаны по умолчанию), но вы можете сбросить стандартный вывод самостоятельно:

 fflush( stdout );

после вызова printf.

1 голос
/ 23 апреля 2011

Mintty и rxvt - эмуляторы терминала на базе псевдо-терминальных устройств Unix . Cygwin реализует их на основе каналов Windows .

Когда вы компилируете программу с помощью Cygwin gcc, она связывается с Cygwin DLL, которая содержит всю магию для того, чтобы заставить потоки, подключенные к терминалу, работать как они должны в системе Unix, что по умолчанию означает буферизацию строки.

Однако, когда вы компилируете программу с помощью tcc, вы создаете собственную программу Windows, и она видит только нижележащие каналы Windows. В библиотеке Microsoft C потоки, подключенные к каналам, по умолчанию полностью буферизуются, поэтому помогает явная очистка с помощью fflush(stdout) или отключение буферизации с помощью setvbuf(stdout, NULL, _IONBF, 0). Библиотека MS C не поддерживает буферизацию строк.

1 голос
/ 23 апреля 2011

Стандартный поток вывода обычно буферизуется строкой, то есть буфер сбрасывается при печати новой строки.

Вы можете очистить его явно с помощью:

fflush(stdout);

И вы можете включитьотключить буферизацию для данного потока s с помощью:

setvbuf(s, NULL, _IONBF, 0);

Подробнее см. справочную страницу setvbuf () .

...