Ответ 1
Как объяснил Майкл, вполне нормально связывать C-библиотеку динамически. Это также описано в книге "Программирование внизу вверх" (см. Главу 8).
Однако очень важно вызвать exit из C-библиотеки, чтобы закончить программу, а не обходить ее, что было неправильно, вызвав exit-syscall. Как намекнул Майкл, выход делает много очистить как потоки промывки.
Вот что произошло: как описано здесь, C-библиотека буферизует стандартные потоки следующим образом:
- Отсутствие буферизации для стандартной ошибки.
- Если стандартный вывод /in является терминалом, он буферизируется по строке.
- Если стандартный out/in не является терминалом, он полностью буферизирован и, следовательно, в конце написания необходим флеш.
Какой случай применяется, решается, когда printf вызывается в первый раз для потока.
Итак, если printf_try вызывается непосредственно в терминале, вывод программы можно увидеть, потому что hello имеет \n в конце (который запускает сброс в режиме буферизации строки), и это терминал, также 2. случай.
Вызов printf_try через $(./printf_try) означает, что stdout больше не является терминалом (на самом деле я не знаю, является ли это временным файлом или файлом памяти), и, следовательно, имеет место 3-й случай - есть необходимо для явного флеша, т.е. вызвать C- exit.