Здравствуйте, Аноним, Вы писали:
_>>Втретил я в одном заброшенном коде код, суть которого сводится к:
_>>
_>>close(dup(fd))
_>>
А>Суть любой программы сводиться к return 0; А>Че там еще есть?
Ну, там много чего есть. Имеем кусок программы, отвечающий за логирование. Логируем в файл, обозначаемый дескриптором fd. Файл открывается на старте, закрывается на финише. Каждые N строк лога делаем close(dup(fd)). Именно в таком виде, никуда временные переменные не сохраняя. Зачем — непонятно.
Здравствуйте, serg_joker, Вы писали:
А>>Суть любой программы сводиться к return 0; А>>Че там еще есть? _>Ну, там много чего есть. Имеем кусок программы, отвечающий за логирование. Логируем в файл, обозначаемый дескриптором fd. Файл открывается на старте, закрывается на финише. Каждые N строк лога делаем close(dup(fd)). Именно в таком виде, никуда временные переменные не сохраняя. Зачем — непонятно.
Может это такой хитрый спосом сделать flush(fd)?
Здравствуйте, Graf Alex, Вы писали:
GA>Здравствуйте, serg_joker, Вы писали:
А>>>Суть любой программы сводиться к return 0; А>>>Че там еще есть? _>>Ну, там много чего есть. Имеем кусок программы, отвечающий за логирование. Логируем в файл, обозначаемый дескриптором fd. Файл открывается на старте, закрывается на финише. Каждые N строк лога делаем close(dup(fd)). Именно в таком виде, никуда временные переменные не сохраняя. Зачем — непонятно. GA>Может это такой хитрый спосом сделать flush(fd)?
Здравствуйте, Were, Вы писали:
W>Здравствуйте, Graf Alex, Вы писали:
GA>>Здравствуйте, serg_joker, Вы писали:
А>>>>Суть любой программы сводиться к return 0; А>>>>Че там еще есть? _>>>Ну, там много чего есть. Имеем кусок программы, отвечающий за логирование. Логируем в файл, обозначаемый дескриптором fd. Файл открывается на старте, закрывается на финише. Каждые N строк лога делаем close(dup(fd)). Именно в таком виде, никуда временные переменные не сохраняя. Зачем — непонятно. GA>>Может это такой хитрый спосом сделать flush(fd)?
Я тоже так подумал сначала. Но вот дело в том, что работа с файловым дескриптором делается поредством небуфферизированного write. Я даже проверил на всякий, каждый write производит реальную запись на диск.
W>А может и заблуждение автора кода )
Вот эта мысль все чаще посещает меня. Но смущает то, что гугл выдает упоминания схожих кусков кода...
GA>>>Может это такой хитрый спосом сделать flush(fd)? _>Я тоже так подумал сначала. Но вот дело в том, что работа с файловым дескриптором делается поредством небуфферизированного write. Я даже проверил на всякий, каждый write производит реальную запись на диск.
W>>А может и заблуждение автора кода ) _>Вот эта мысль все чаще посещает меня. Но смущает то, что гугл выдает упоминания схожих кусков кода...
по fflush() DOS не обновляет информацию о файле, добавлен
close(dup(fd));
Отсюда следует, что действительно это "хитрый" fflush. Вот хотелось бы теперь подтверждения от знающего человека какие бонусы мы получает от такого финта.
Здравствуйте, serg_joker, Вы писали:
GA>>>>Может это такой хитрый спосом сделать flush(fd)? _>>Я тоже так подумал сначала. Но вот дело в том, что работа с файловым дескриптором делается поредством небуфферизированного write. Я даже проверил на всякий, каждый write производит реальную запись на диск.
W>>>А может и заблуждение автора кода ) _>>Вот эта мысль все чаще посещает меня. Но смущает то, что гугл выдает упоминания схожих кусков кода...
_>Погуглил еще и нашел уже что-то. Там такое вот: _>
по fflush() DOS не обновляет информацию о файле, добавлен
_>close(dup(fd));
_>Отсюда следует, что действительно это "хитрый" fflush. Вот хотелось бы теперь подтверждения от знающего человека какие бонусы мы получает от такого финта.
fflush() работает с FILE*
А для семейства низкоуровневых функций которые работаают с file handlers (int) прямого аналога такой функции нет.
(В VC runtime есть нестандартный commit(int fd))
Т.е. close(dup(fd)) это такой способ сделать flush когда у тебя есть file descriptor в виде int.
Здравствуйте, c-smile, Вы писали:
CS>fflush() работает с FILE*
CS>А для семейства низкоуровневых функций которые работаают с file handlers (int) прямого аналога такой функции нет. CS>(В VC runtime есть нестандартный commit(int fd))
CS>Т.е. close(dup(fd)) это такой способ сделать flush когда у тебя есть file descriptor в виде int.
CS>Ничего хитрого в общем-то.
Согласен, хитрого ничего, если бы не это (MSDN):
Low-level input and output calls do not buffer or format data.
То есть все функции open/create/write/close/dup/dup2/... работают с файлами небуферизировано (что было подтверждено экспериментом), т.е. отсутствие flush в данном наборе совершенно оправданно. Тем не менее, охотно верю, что смысл в этом вызове все-таки есть. И какие-то данные не сбрасываются на диск без него. Вопрос — какие ?
Здравствуйте, serg_joker, Вы писали:
_>Здравствуйте, c-smile, Вы писали:
CS>>fflush() работает с FILE*
CS>>А для семейства низкоуровневых функций которые работаают с file handlers (int) прямого аналога такой функции нет. CS>>(В VC runtime есть нестандартный commit(int fd))
CS>>Т.е. close(dup(fd)) это такой способ сделать flush когда у тебя есть file descriptor в виде int.
CS>>Ничего хитрого в общем-то. _>Согласен, хитрого ничего, если бы не это (MSDN):
_>
Low-level input and output calls do not buffer or format data.
_>То есть все функции open/create/write/close/dup/dup2/... работают с файлами небуферизировано (что было подтверждено экспериментом), т.е. отсутствие flush в данном наборе совершенно оправданно. Тем не менее, охотно верю, что смысл в этом вызове все-таки есть. И какие-то данные не сбрасываются на диск без него. Вопрос — какие ?
Здравствуйте, serg_joker, Вы писали:
_>То есть все функции open/create/write/close/dup/dup2/... работают с файлами небуферизировано (что было подтверждено экспериментом), т.е. отсутствие flush в данном наборе совершенно оправданно. Тем не менее, охотно верю, что смысл в этом вызове все-таки есть. И какие-то данные не сбрасываются на диск без него. Вопрос — какие ?
Ну если упоминание про DOS верно, то у неё был свой специфический кэш. В частности, метаданные файла, видимые другим процессам, не обновлялись до закрытия. Может, это их актуализирует?
_>Не мог бы кто — нибудь подтокнуть к мысли зачем бы это могло быть нужным?
Это какая-то хитрая индийская мантра.
В UNIX'е такая конструкция не делает ничего полезного, и я сомневаюсь, что она делает что-либо полезное на венде. Возможно на какой-нибудь экзотической системе она имеет эффект fsync(), но сомневаюсь...
А может быть, там ранше был код между dup() и close(), но постепенно весь вышел, будучи убит последовательностью #if 0 ... #endif. Потом кто-то в порыве наведения чистоты весь код, который явно ничего не делает, вычистил, а dup() и close() удалить не решился.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, serg_joker, Вы писали:
_>>
_>>close(dup(fd))
_>>
_>>Не мог бы кто — нибудь подтокнуть к мысли зачем бы это могло быть нужным?
Pzz>Это какая-то хитрая индийская мантра.
Pzz>В UNIX'е такая конструкция не делает ничего полезного, и я сомневаюсь, что она делает что-либо полезное на венде. Возможно на какой-нибудь экзотической системе она имеет эффект fsync(), но сомневаюсь...
Pzz>А может быть, там ранше был код между dup() и close(), но постепенно весь вышел, будучи убит последовательностью #if 0 ... #endif. Потом кто-то в порыве наведения чистоты весь код, который явно ничего не делает, вычистил, а dup() и close() удалить не решился.
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, serg_joker, Вы писали:
_>>То есть все функции open/create/write/close/dup/dup2/... работают с файлами небуферизировано (что было подтверждено экспериментом), т.е. отсутствие flush в данном наборе совершенно оправданно. Тем не менее, охотно верю, что смысл в этом вызове все-таки есть. И какие-то данные не сбрасываются на диск без него. Вопрос — какие ?
N>Ну если упоминание про DOS верно, то у неё был свой специфический кэш. В частности, метаданные файла, видимые другим процессам, не обновлялись до закрытия. Может, это их актуализирует?
Может.
В общем цель моя достигнута: я удаляю это без сомнений. (Я бы все равно удалил, т.к. там, кроме всего прочего, использовались функции из разных наборов — _lopen, _lclose и dup ).