Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: FILE_FLAG_DELETE_ON_CLOSE  (Прочитано 10101 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 31-08-2010 18:32 » 

Создаю файл с флагом FILE_FLAG_DELETE_ON_CLOSE, то есть файл должен удалиться системой, как только будут освобождены все хендлы этого файла.

Затем, запускаю некий процесс, указав данный файл в параметрах командной строки. Процесс запускается, открывает файл, работает с ним.

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

Для наглядности приведу последовательность действий
Код:
HANDLE f=CreateFile("file.txt",...... FILE_FLAG_DELETE_ON_CLOSE.....);

CreateProcess(...,"programm.exe \"file.txt\"",.....);

//тут нужно как-то узнать, открыл ли процесс файл

//дождались, теперь можно закрыть первый хендл файла
CloseHandle(f);
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 31-08-2010 18:43 » 

Леш, а попробуй наследовать открытый файл. Ведь по идее должно произойти дублирование.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 31-08-2010 19:39 » 

это как сделать? Указать флаг   BOOL bInheritHandles  в CreateProcess ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 31-08-2010 19:49 » 

если да, то интересует следующее: хендл унаследовался. Но процесс то открывает файл как обычно (ещё одна копия хендла?), потом он файл закроет, а унаследованный останется открыт ? Ведь процесс может продолжать работать, он не обязательно завершиться после работы с файлом
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 31-08-2010 21:22 » 

А вот это уточни в MSDN Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 31-08-2010 21:34 » 

Код:
If this parameter TRUE, each inheritable handle in the calling process is inherited by the new process. If the parameter is FALSE, the handles are not inherited. Note that inherited handles have the same value and access rights as the original handles.
молчит, как рыба об лёд. Но, по ходу дела, должны оставаться хендлы.
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 01-09-2010 03:56 » 

Да, но как ими пользоваться?...

Скажем, в POSIX системах при создании процесса выполняется fork(), который создает копию родительского процесса и, что важно, последовательность выполнения команд продолжается с того же fork(), но с другим кодом результата. Так можно закрыть все лишнее, подготовиться и потом уже запускать (с своем процессе) другой бинарник.
В винде процесс создается сразу из образа другого бинарника. Где искать этот хендл, как потом определить, что этот тот файл...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 01-09-2010 04:55 » 

Ну, мне пользоваться не нужно.  Процесс даже не мой )) Хендл просто как мусор там будет лежать. А передать, по моему, можно как угодно (через поток, например) - ведь это всего лишь 32-битное значение

А я отказался от FILE_FLAG_DELETE_ON_CLOSE , неудобно в моём случае
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 01-09-2010 06:59 » 

fork под винду самому можно написать на Native API. В книге Нэббета есть полный исходник (там не много кода). Просто fork в винде никому не нужен.
Если честно, когда я впервые узнал про fork, то очень долго не мог осмыслить такого способа порождения процесса.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 01-09-2010 07:45 » 

resource, а что такое fork
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 01-09-2010 07:56 » 

Леш, это создание копии текущего процесса — естественный способ создания новых процессов в POSIX-системах.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 01-09-2010 08:33 » 

круто ) Но в моём случае - бесполезно
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines