Цель вызова close(dup(fd))
От: serg_joker Украина  
Дата: 23.06.08 11:54
Оценка:
Добрый день, коллеги.

Втретил я в одном заброшенном коде код, суть которого сводится к:

close(dup(fd))


Не мог бы кто — нибудь подтокнуть к мысли зачем бы это могло быть нужным?

Заранее благодарен.
Re: Цель вызова close(dup(fd))
От: Аноним  
Дата: 23.06.08 14:29
Оценка:
_>Втретил я в одном заброшенном коде код, суть которого сводится к:

_>
_>close(dup(fd))
_>


Суть любой программы сводиться к return 0;
Че там еще есть?
Re[2]: Цель вызова close(dup(fd))
От: serg_joker Украина  
Дата: 23.06.08 15:08
Оценка:
Здравствуйте, Аноним, Вы писали:

_>>Втретил я в одном заброшенном коде код, суть которого сводится к:


_>>
_>>close(dup(fd))
_>>


А>Суть любой программы сводиться к return 0;

А>Че там еще есть?
Ну, там много чего есть. Имеем кусок программы, отвечающий за логирование. Логируем в файл, обозначаемый дескриптором fd. Файл открывается на старте, закрывается на финише. Каждые N строк лога делаем close(dup(fd)). Именно в таком виде, никуда временные переменные не сохраняя. Зачем — непонятно.

Спасибо.
Re[3]: Цель вызова close(dup(fd))
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 23.06.08 15:23
Оценка:
Здравствуйте, serg_joker, Вы писали:

А>>Суть любой программы сводиться к return 0;

А>>Че там еще есть?
_>Ну, там много чего есть. Имеем кусок программы, отвечающий за логирование. Логируем в файл, обозначаемый дескриптором fd. Файл открывается на старте, закрывается на финише. Каждые N строк лога делаем close(dup(fd)). Именно в таком виде, никуда временные переменные не сохраняя. Зачем — непонятно.
Может это такой хитрый спосом сделать flush(fd)?
Re[4]: Цель вызова close(dup(fd))
От: Were  
Дата: 23.06.08 16:06
Оценка:
Здравствуйте, Graf Alex, Вы писали:

GA>Здравствуйте, serg_joker, Вы писали:


А>>>Суть любой программы сводиться к return 0;

А>>>Че там еще есть?
_>>Ну, там много чего есть. Имеем кусок программы, отвечающий за логирование. Логируем в файл, обозначаемый дескриптором fd. Файл открывается на старте, закрывается на финише. Каждые N строк лога делаем close(dup(fd)). Именно в таком виде, никуда временные переменные не сохраняя. Зачем — непонятно.
GA>Может это такой хитрый спосом сделать flush(fd)?

А может и заблуждение автора кода )
Re[5]: Цель вызова close(dup(fd))
От: serg_joker Украина  
Дата: 23.06.08 17:24
Оценка:
Здравствуйте, Were, Вы писали:

W>Здравствуйте, Graf Alex, Вы писали:


GA>>Здравствуйте, serg_joker, Вы писали:


А>>>>Суть любой программы сводиться к return 0;

А>>>>Че там еще есть?
_>>>Ну, там много чего есть. Имеем кусок программы, отвечающий за логирование. Логируем в файл, обозначаемый дескриптором fd. Файл открывается на старте, закрывается на финише. Каждые N строк лога делаем close(dup(fd)). Именно в таком виде, никуда временные переменные не сохраняя. Зачем — непонятно.
GA>>Может это такой хитрый спосом сделать flush(fd)?
Я тоже так подумал сначала. Но вот дело в том, что работа с файловым дескриптором делается поредством небуфферизированного write. Я даже проверил на всякий, каждый write производит реальную запись на диск.

W>А может и заблуждение автора кода )

Вот эта мысль все чаще посещает меня. Но смущает то, что гугл выдает упоминания схожих кусков кода...
Re[6]: Цель вызова close(dup(fd))
От: serg_joker Украина  
Дата: 23.06.08 17:31
Оценка:
GA>>>Может это такой хитрый спосом сделать flush(fd)?
_>Я тоже так подумал сначала. Но вот дело в том, что работа с файловым дескриптором делается поредством небуфферизированного write. Я даже проверил на всякий, каждый write производит реальную запись на диск.

W>>А может и заблуждение автора кода )

_>Вот эта мысль все чаще посещает меня. Но смущает то, что гугл выдает упоминания схожих кусков кода...

Погуглил еще и нашел уже что-то. Там такое вот:

по fflush() DOS не обновляет информацию о файле, добавлен
close(dup(fd));

Отсюда следует, что действительно это "хитрый" fflush. Вот хотелось бы теперь подтверждения от знающего человека какие бонусы мы получает от такого финта.

Спасибо.
Re[7]: Цель вызова close(dup(fd))
От: c-smile Канада http://terrainformatica.com
Дата: 23.06.08 17:44
Оценка:
Здравствуйте, 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.

Ничего хитрого в общем-то.
Re[8]: Цель вызова close(dup(fd))
От: serg_joker Украина  
Дата: 23.06.08 18:00
Оценка:
Здравствуйте, 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 в данном наборе совершенно оправданно. Тем не менее, охотно верю, что смысл в этом вызове все-таки есть. И какие-то данные не сбрасываются на диск без него. Вопрос — какие ?

Спасибо.
Re[9]: Цель вызова close(dup(fd))
От: c-smile Канада http://terrainformatica.com
Дата: 23.06.08 18:11
Оценка:
Здравствуйте, 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 в данном наборе совершенно оправданно. Тем не менее, охотно верю, что смысл в этом вызове все-таки есть. И какие-то данные не сбрасываются на диск без него. Вопрос — какие ?

Дата модификации файла например.
Re[9]: Цель вызова close(dup(fd))
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 23.06.08 19:02
Оценка:
Здравствуйте, serg_joker, Вы писали:

_>То есть все функции open/create/write/close/dup/dup2/... работают с файлами небуферизировано (что было подтверждено экспериментом), т.е. отсутствие flush в данном наборе совершенно оправданно. Тем не менее, охотно верю, что смысл в этом вызове все-таки есть. И какие-то данные не сбрасываются на диск без него. Вопрос — какие ?


Ну если упоминание про DOS верно, то у неё был свой специфический кэш. В частности, метаданные файла, видимые другим процессам, не обновлялись до закрытия. Может, это их актуализирует?
The God is real, unless declared integer.
Re: Цель вызова close(dup(fd))
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.06.08 21:28
Оценка:
Здравствуйте, serg_joker, Вы писали:

_>
_>close(dup(fd))
_>


_>Не мог бы кто — нибудь подтокнуть к мысли зачем бы это могло быть нужным?


Это какая-то хитрая индийская мантра.

В UNIX'е такая конструкция не делает ничего полезного, и я сомневаюсь, что она делает что-либо полезное на венде. Возможно на какой-нибудь экзотической системе она имеет эффект fsync(), но сомневаюсь...

А может быть, там ранше был код между dup() и close(), но постепенно весь вышел, будучи убит последовательностью #if 0 ... #endif. Потом кто-то в порыве наведения чистоты весь код, который явно ничего не делает, вычистил, а dup() и close() удалить не решился.
Re[2]: Цель вызова close(dup(fd))
От: serg_joker Украина  
Дата: 24.06.08 06:17
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, serg_joker, Вы писали:


_>>
_>>close(dup(fd))
_>>


_>>Не мог бы кто — нибудь подтокнуть к мысли зачем бы это могло быть нужным?


Pzz>Это какая-то хитрая индийская мантра.


Pzz>В UNIX'е такая конструкция не делает ничего полезного, и я сомневаюсь, что она делает что-либо полезное на венде. Возможно на какой-нибудь экзотической системе она имеет эффект fsync(), но сомневаюсь...


Pzz>А может быть, там ранше был код между dup() и close(), но постепенно весь вышел, будучи убит последовательностью #if 0 ... #endif. Потом кто-то в порыве наведения чистоты весь код, который явно ничего не делает, вычистил, а dup() и close() удалить не решился.


Я удалить решился
Спасибо.
Re[10]: Цель вызова close(dup(fd))
От: serg_joker Украина  
Дата: 24.06.08 06:19
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, serg_joker, Вы писали:


_>>То есть все функции open/create/write/close/dup/dup2/... работают с файлами небуферизировано (что было подтверждено экспериментом), т.е. отсутствие flush в данном наборе совершенно оправданно. Тем не менее, охотно верю, что смысл в этом вызове все-таки есть. И какие-то данные не сбрасываются на диск без него. Вопрос — какие ?


N>Ну если упоминание про DOS верно, то у неё был свой специфический кэш. В частности, метаданные файла, видимые другим процессам, не обновлялись до закрытия. Может, это их актуализирует?



Может.
В общем цель моя достигнута: я удаляю это без сомнений. (Я бы все равно удалил, т.к. там, кроме всего прочего, использовались функции из разных наборов — _lopen, _lclose и dup ).

Всем спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.