ну не на винфак (кстати, где он) мне же идти :-)
ситуация такая : есть софт, который динамически, через a-la dlopen тягает разные библиотеки (gtk, но только к примеру, он классический любитель «срать» в stderr). Всё замечательно абсолютно везде кроме Win GUI.
там (в gui офтопике) потоки stdin, stdout, stderr и соотв. 0,1,2 закрыты. Малейшая попытка write чревата. Повезёт если просто не упадёт. Я загружаю библиотеку и она может ругаться в stderr но работает, и не должна валиться от write(2,..) где-то внутри.
я вот помню что ранее давно-давно находил нужные заклинания аналогов dup2, какие необходимо произнести в виндовс ДО ТОГО и чтобы всё сложилось верно.
Проблема: я не могу повторить это на офтопике :-( открыть аналог /dev/null и dup2 его в стандартный вывод процесса.
максимум что вспомнилось
void ReopenStd()
{
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
if (h==INVALID_HANDLE_VALUE) {
// stdout закрыт, надо открыть новый и задать его в STD_OUTPUT_HANDLE
int out=_open("NUL:",_O_WRONLY|_O_TEXT);
if (out>=0) {
_dup2(out,1/*STD_OUTPUT_HANDLE*/);
_close(out);
}
}
h = GetStdHandle(STD_ERROR_HANDLE);
if (h==INVALID_HANDLE_VALUE) {
// stderr закрыт, надо открыть новый и задать его в STD_ERROR_HANDLE
int out=_open("NUL:",_O_WRONLY|_O_TEXT);
if (out>=0) {
_dup2(out,2/*STD_ERROR_HANDLE*/);
_close(out);
}
}
h = GetStdHandle(STD_INPUT_HANDLE);
if (h==INVALID_HANDLE_VALUE) {
// stdin закрыт, надо открыть новый и задать его в STD_INPUT_HANDLE
int in=_open("NUL:",_O_RDONLY|_O_TEXT);
if (in>=0) {
_dup2(in,0/*STD_ERROR_HANDLE*/);
_close(in);
}
}
}
но это неверно.
PS/ если ЧЁ: компилятор gcc, окружение msys2/mingw64
offtop, winapi