Неправильно сочетаются буферизованные и небуферизованные функции ввода-вывода. Такая комбинация должна выполняться очень тщательно, особенно когда код должен быть переносимым. (и плохо писать неуправляемый код ...) Конечно, лучше избегать объединения буферизованного и небуферизованного ввода-вывода в один и тот же файловый дескриптор.
Буферизованный IO: fprintf()
, fopen()
, fclose()
, freopen()
...
Небуферизованный IO: write()
, open()
, close()
, dup()
...
Когда вы используете dup2()
для перенаправление stdout. Функция не знает буфер, который был заполнен fprintf()
. Поэтому, когда dup2()
закрывает старый дескриптор 1, он не очищает буфер и содержимое может быть сброшено на другой выход. В вашем случае 2a оно было отправлено на /dev/null
.
В вашем случае лучше использовать freopen()
вместо dup2()
. Это решает все ваши проблемы:
FILE
. (случай 2a) Вот правильная реализация вашей функции:
void RedirectStdout2File(const char* log_path) {
if(freopen(log_path, "a+", stdout) == NULL) err(EXIT_FAILURE, NULL);
}
К сожалению, с буферизованным IO вы не можете напрямую устанавливать разрешения для вновь созданного файла. Вы должны использовать другие вызовы для изменения разрешений или использовать неперехваченные расширения glibc. См. fopen() man page
.
Когда вы используете пользовательскую директиву / pipe в совместно используемом модуле, вам также необходимо экспортировать ее.
По сути, в вашем уроке он создал директиву и объявил ее в модуле приложения. Но в вашем примере вы помещаете свою директиву в общий модуль, поэтому вам нужно поместить свою директиву в скобки объявлений, а также в экспорт.
shared.module.ts :
@NgModule({
/* ... */
declarations: [YourDirective],
exports: [YourDirective]
/* ... */
})